Задавайте вопросы, мы ответим
Вы не зашли.
Как правильно выбрать запись с 1 запросом и под запросов.
Есть таблица заказов
Zakaz - id name user_id
И таблица пользователей
User - id name
Нужно выбрать всех пользователей которые не сделали заказ.
Неактивен
Либо по-плохому:
Неактивен
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;
А можно же сделать так ?
Неактивен
Нет, это некорректная конструкция. А чем Вам не подошли те два варианта, которые выше приведены?
Неактивен
deadka написал:
Нет, это некорректная конструкция. А чем Вам не подошли те два варианта, которые выше приведены?
Скажите пожалуйста в чем она не корректная, она же верно работает.
Неактивен
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)
Вы все еще считаете, что он верно работает?
Неактивен
Ошибся вместо LEFT нужно INNER
SELECT `u`.* FROM `t_5629_users` `u` INNER JOIN `t_5629_zakaz` `z` ON `u`.`id` != `z`.`user_id`;
Неактивен
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)
Ничем не лучше. Почитайте здесь.
Неактивен
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)Ничем не лучше. Почитайте здесь.
Странно, сейчас снова проверю
Неактивен