Есть две таблицы
TAB1 `id_user` //таблица пользователей
TAB2 `id_user`,`id_ban_user` //таблица заблокированных польз для конкретного.
Нужно вывести все id из первой таблицы, которых нет во второй.
Посоветуйте пожалуйста будет ли большая нагрузка на сервер, если количество пользователей будет около 1000 и у каждого будет в бан списке по несколько человек?
Спустя 18 минут, 36 секунд (5.04.2012 - 12:33) Placido написал(а):
Не совсем ясно, что нужно вывести.
При поставленных условиях, в целом, так
При поставленных условиях, в целом, так
SELECT `id_user` FROM `TAB1`
WHERE `id_user` NOT IN (SELECT `id_user` FROM `TAB2`);
Спустя 3 минуты, 54 секунды (5.04.2012 - 12:37) maximka787 написал(а):
Placido
Если восем вкратце, то нужно вот что:
Первая таблица (поле `id`)
1
2
3
4
Вторая таблица (поле `id`)
2
3
Нужно вывести из первой таблицы
1
4
Если восем вкратце, то нужно вот что:
Первая таблица (поле `id`)
1
2
3
4
Вторая таблица (поле `id`)
2
3
Нужно вывести из первой таблицы
1
4
Спустя 2 минуты, 26 секунд (5.04.2012 - 12:39) Placido написал(а):
См. ответ выше.
Спустя 3 минуты, 55 секунд (5.04.2012 - 12:43) maximka787 написал(а):
Placido
Да спасибо, работает хорошо. Только еще вопрос, а это не медленный запрос? у меня он выводит данные на 10 строк 0.03 сек. При большом объеме не долгий он?
Я интресуюсь потому что тут запрос с подзапросом. Сам я пытался сдлать через JOIN, но так и не сообразил)
Да спасибо, работает хорошо. Только еще вопрос, а это не медленный запрос? у меня он выводит данные на 10 строк 0.03 сек. При большом объеме не долгий он?
Я интресуюсь потому что тут запрос с подзапросом. Сам я пытался сдлать через JOIN, но так и не сообразил)
Спустя 2 часа, 37 минут, 57 секунд (5.04.2012 - 15:21) Placido написал(а):
Точно не скажу, но думаю, что это нормальный запрос - там ведь выборка по первичному ключу идет (и в самом запросе, и в подзапросе).
Можно с помощью JOIN
Можно с помощью JOIN
SELECT `t1`.`id_user`
FROM `TAB1` `t1` LEFT JOIN `TAB2` `t2`
ON `t1`.`id_user` = `t2`.`id_user`
WHERE `t2`.`id_user` IS NULL;
Спустя 6 часов, 35 минут, 18 секунд (5.04.2012 - 21:57) Лена написал(а):
В вашем случае быстрее всего будет работать внутреннее соединение через where:
Немного медленней (но быстрее, чем Left join или подзапрос) будет работать перекрестное соединение:
Это соединение и так вытянет из первой таблицы все, что есть во второй. Обратите внимание, что используется using, когда ключевое поле имеет одно и то же имя. В противном случае - ON.
SELECT `t1`.`id_user`
FROM `TAB1` `t1`, `TAB2` `t2`
WHERE `t1`.`id` = `t2`.`id`
Немного медленней (но быстрее, чем Left join или подзапрос) будет работать перекрестное соединение:
SELECT `t1`.`id_user`
FROM `TAB1` `t1` INNER JOIN `TAB2` `t2`
using(id);
Это соединение и так вытянет из первой таблицы все, что есть во второй. Обратите внимание, что используется using, когда ключевое поле имеет одно и то же имя. В противном случае - ON.
Спустя 12 часов, 14 минут, 22 секунды (6.04.2012 - 10:11) maximka787 написал(а):
Placido
да, хороший запрос, спасибо.
Лена
у меня несколько иные условия были, либо вы просто суть написали, но все равно спасибо за подсказку.
И еще вопрос совсем не в тему, как наполнить запросом пару тысяц произвольных записей. например ставить 100000 строк без цикла на php?
да, хороший запрос, спасибо.
Лена
у меня несколько иные условия были, либо вы просто суть написали, но все равно спасибо за подсказку.
И еще вопрос совсем не в тему, как наполнить запросом пару тысяц произвольных записей. например ставить 100000 строк без цикла на php?
Спустя 16 минут, 12 секунд (6.04.2012 - 10:27) h234 написал(а):
Цитата (maximka787 @ 6.04.2012 - 07:11) |
И еще вопрос совсем не в тему, как наполнить запросом пару тысяц произвольных записей. например ставить 100000 строк без цикла на php? |
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),...,(7,8,9);
Спустя 6 минут, 17 секунд (6.04.2012 - 10:33) maximka787 написал(а):
h234
это ведь надо заполнять VALUES вручную. Я имел ввиду одним запросом вставить 100.000 срок, пусть и пустых. там все равно autoincrement на ключ.
это ведь надо заполнять VALUES вручную. Я имел ввиду одним запросом вставить 100.000 срок, пусть и пустых. там все равно autoincrement на ключ.
Спустя 8 минут, 30 секунд (6.04.2012 - 10:42) h234 написал(а):
Вы можете циклом создать набор данных и вставить их одним запросом
Спустя 38 секунд (6.04.2012 - 10:43) Placido написал(а):
Без цикла вряд ли получится. Либо цикл на PHP, либо хранимая процедура MySQL (тоже с циклом внутри).
Можно воспользоваться сторонним сервисом, например http://www.generatedata.com/#generator (максимум 5000 инсертов)
или готовым решением (без ограничения количества записей), например http://www.phpclasses.org/package/6416-PHP...andom-data.html (проверял, sql на 100 000 записей генерирует секунд 10)
Можно воспользоваться сторонним сервисом, например http://www.generatedata.com/#generator (максимум 5000 инсертов)
или готовым решением (без ограничения количества записей), например http://www.phpclasses.org/package/6416-PHP...andom-data.html (проверял, sql на 100 000 записей генерирует секунд 10)
Спустя 7 минут, 38 секунд (6.04.2012 - 10:50) maximka787 написал(а):
Placido
спасибо, почитаю. Тоже видел на счет цикла в mysql думал есть очень простое что-то еще.
спасибо, почитаю. Тоже видел на счет цикла в mysql думал есть очень простое что-то еще.
Спустя 14 минут, 20 секунд (6.04.2012 - 11:05) h234 написал(а):
<?php
$db = mysql_connect('localhost', 'root', '');
mysql_select_db('base');
$start = microtime();
for ($i=0;$i<100000;$i++){
$str .= '(NULL),';
}
$str = substr($str, 0, -1);
$query = "INSERT INTO `tb`(`id`) VALUES $str";
mysql_query($query);
mysql_close($db);
$end = microtime() - $start;
echo $end;
?>
0.407472
Спустя 21 минута, 35 секунд (6.04.2012 - 11:26) maximka787 написал(а):
Даа.... ребят. проверил вывод на
TAB1 100.000 строк (всех пользователей) и
TAB2 1000 заблокированных
Результат конечно ужасный. больше минуты на выполнение и это на поиск для одного пользователя. А вы представьте в том же "контакте" выводить список людей, сразу с вычетом заблокированных
Слишком долго думает. надо совсем иной способ искать.
TAB1 100.000 строк (всех пользователей) и
TAB2 1000 заблокированных
Результат конечно ужасный. больше минуты на выполнение и это на поиск для одного пользователя. А вы представьте в том же "контакте" выводить список людей, сразу с вычетом заблокированных
Слишком долго думает. надо совсем иной способ искать.
Спустя 6 минут, 50 секунд (6.04.2012 - 11:33) maximka787 написал(а):
ну я дал..))) все норм. я забыл LIMIT учитывать, постраничный же вывод))
_____________
..Работает - не трогай!