SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.04.2012 11:44:31

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Выборка записей

Как правильно выбрать запись с 1 запросом и под запросов.

Есть таблица заказов

Zakaz - id name user_id

И таблица пользователей

User - id name

Нужно выбрать всех пользователей которые не сделали заказ.

Неактивен

 

#2 17.04.2012 13:42:28

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка записей

Либо по-плохому:

SELECT * FROM `users` WHERE `id` NOT IN (SELECT `user_id` FROM `Zakaz`);

Либо по-хорошему:

SELECT `u`.* FROM `users` `u` LEFT JOIN  `Zakaz` `z` ON `u`.`id` = `z`.`user_id` WHERE `z`.`user_id` IS NULL;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 17.04.2012 18:25:19

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Выборка записей

deadka написал:

Либо по-плохому:

SELECT * FROM `users` WHERE `id` NOT IN (SELECT `user_id` FROM `Zakaz`);

Либо по-хорошему:

SELECT `u`.* FROM `users` `u` LEFT JOIN  `Zakaz` `z` ON `u`.`id` = `z`.`user_id` WHERE `z`.`user_id` IS NULL;

А можно же сделать так ?

SELECT `u`.* FROM `users` `u` LEFT JOIN  `Zakaz` `z` ON `u`.`id` != `z`.`user_id`

Неактивен

 

#4 17.04.2012 19:05:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка записей

Нет, это некорректная конструкция. А чем Вам не подошли те два варианта, которые выше приведены?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 17.04.2012 21:23:06

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Выборка записей

deadka написал:

Нет, это некорректная конструкция. А чем Вам не подошли те два варианта, которые выше приведены?

Скажите пожалуйста в чем она не корректная, она же верно работает.

Неактивен

 

#6 17.04.2012 21:35:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка записей

Код:

mysql> create table t_5629_users(id int, `name` varchar(255));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_5629_users VALUES(1, 'Ivan'),(2, 'Petr'), (3, 'Sidor');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> create table t_5629_zakaz(id int, user_id int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_5629_zakaz VALUES(1, 2),(2, 3), (3, 3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t_5629_users;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Ivan  |
|    2 | Petr  |
|    3 | Sidor |
+------+-------+
3 rows in set (0.00 sec)

mysql> select * from t_5629_zakaz;
+------+---------+
| id   | user_id |
+------+---------+
|    1 |       2 |
|    2 |       3 |
|    3 |       3 |
+------+---------+

Иван не сделал заказов, Петр сделал один заказ (под номером 1), Сидор сделал два заказа под номерами 2 и 3.
Цель, как  я понял, найти тех, кто не сделал ни одного заказа - то есть Ивана.
Мои варианты запросов:

Код:

mysql> SELECT * FROM t_5629_users `users` WHERE `id` NOT IN (SELECT `user_id` FROM t_5629_zakaz `Zakaz`);
+------+------+
| id   | name |
+------+------+
|    1 | Ivan |
+------+------+
1 row in set (0.00 sec)

mysql> SELECT `u`.* FROM `t_5629_users` `u` LEFT JOIN  `t_5629_zakaz` `z` ON `u`.`id` = `z`.`user_id` WHERE `z`.`user_id` IS NULL;
+------+------+
| id   | name |
+------+------+
|    1 | Ivan |
+------+------+
1 row in set (0.01 sec)

Ваш запрос:

Код:

mysql> SELECT `u`.* FROM `t_5629_users` `u` LEFT JOIN  `t_5629_zakaz` `z` ON `u`.`id` != `z`.`user_id`;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Ivan  |
|    1 | Ivan  |
|    1 | Ivan  |
|    2 | Petr  |
|    2 | Petr  |
|    3 | Sidor |
+------+-------+
6 rows in set (0.00 sec)

Вы все еще считаете, что он верно работает?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 17.04.2012 21:44:38

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Выборка записей

Ошибся вместо LEFT нужно INNER
SELECT `u`.* FROM `t_5629_users` `u` INNER JOIN  `t_5629_zakaz` `z` ON `u`.`id` != `z`.`user_id`;

Неактивен

 

#8 17.04.2012 21:47:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка записей

Код:

mysql> SELECT `u`.* FROM `t_5629_users` `u` INNER JOIN  `t_5629_zakaz` `z` ON `u`.`id` != `z`.`user_id`;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Ivan  |
|    3 | Sidor |
|    1 | Ivan  |
|    2 | Petr  |
|    1 | Ivan  |
|    2 | Petr  |
+------+-------+
6 rows in set (0.00 sec)

Ничем не лучше. Почитайте здесь.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 17.04.2012 22:09:55

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Выборка записей

deadka написал:

Код:

mysql> SELECT `u`.* FROM `t_5629_users` `u` INNER JOIN  `t_5629_zakaz` `z` ON `u`.`id` != `z`.`user_id`;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Ivan  |
|    3 | Sidor |
|    1 | Ivan  |
|    2 | Petr  |
|    1 | Ivan  |
|    2 | Petr  |
+------+-------+
6 rows in set (0.00 sec)

Ничем не лучше. Почитайте здесь.

Странно, сейчас снова проверю

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson