[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос на вывод с исключением
maximka787
Ребят, подскажите пожалуйста, может это совсем просто, но у меня проблема, тк не освоил до конца JOIN и пытаюсь одними WHERE.

Есть две таблицы
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

Спустя 2 минуты, 26 секунд (5.04.2012 - 12:39) Placido написал(а):
См. ответ выше.

Спустя 3 минуты, 55 секунд (5.04.2012 - 12:43) maximka787 написал(а):
Placido
Да спасибо, работает хорошо. Только еще вопрос, а это не медленный запрос? у меня он выводит данные на 10 строк 0.03 сек. При большом объеме не долгий он?

Я интресуюсь потому что тут запрос с подзапросом. Сам я пытался сдлать через JOIN, но так и не сообразил)

Спустя 2 часа, 37 минут, 57 секунд (5.04.2012 - 15:21) Placido написал(а):
Точно не скажу, но думаю, что это нормальный запрос - там ведь выборка по первичному ключу идет (и в самом запросе, и в подзапросе).
Можно с помощью 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:

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?

Спустя 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 на ключ.

Спустя 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)

Спустя 7 минут, 38 секунд (6.04.2012 - 10:50) maximka787 написал(а):
Placido
спасибо, почитаю. Тоже видел на счет цикла в 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 заблокированных

Результат конечно ужасный. больше минуты на выполнение и это на поиск для одного пользователя. А вы представьте в том же "контакте" выводить список людей, сразу с вычетом заблокированных
Слишком долго думает. надо совсем иной способ искать.

Спустя 6 минут, 50 секунд (6.04.2012 - 11:33) maximka787 написал(а):
ну я дал..))) все норм. я забыл LIMIT учитывать, постраничный же вывод))


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.