Добрый день. Назрело у меня два вопроса по MySQL. 1) Есть 2-е таблицы( users - пользователи, orders - заказы ) Нужно выбрать всех пользователей из users, у которых все записи в orders.status имеют значение "0". Мне приходит в голову только следующее: SELECT u.*, o.* FROM orders o LEFT JOIN users u ON o.user_id = u.user_id WHERE o.status = '0' GROUP BY u.users_id Но в данном случае будут выбраны все юзеры, которые имеют хоть одну запись в таблице orders с status равный "0", а нужно чтобы все были "0" и ни одной записи у данного пользователя с другим значением. 2) Все тоже самое что и в первом, только количество записей в orders должно быть больше N. В голову приходит следующее: SELECT u.*, o.* FROM orders o LEFT JOIN users u ON o.user_id = u.user_id WHERE o.status = '0' and COUNT(o.id) > N GROUP BY u.users_id Как правильно прописать ума не приложу.
В лоб. Выбираем всех пользователей у которых все записи 0: [sql]select distinct user_id from orders where status=0 and user_id not in (select user_id from orders where status<>0)[/sql] Прицепляем к таблице пользователей: [sql]select distinct users.user_id, name from users join (select distinct user_id from orders where status=0 and user_id not in (select user_id from orders where status<>0)) as zeroUsers on users.user_id=zeroUsers.user_id[/sql] Тоже самое но записей больше N: [sql]select distinct users.user_id, name from users join (select user_id from orders where status=0 and user_id not in (select user_id from orders where status<>0) group by user_id having count(*)>N) as zeroUsers on users.user_id=zeroUsers.user_id[/sql]
Re: В лоб. Спасибо. Пойду учить вложенные запросы. П.с. думал, что можно реализовать без вложенных запросов.
Re: В лоб. Может и можно. Это ж решение "в лоб". Вполне вероятно, что существуют более красивые решения.
1)Немного кривовато: SELECT u.* FROM users u,orders 0 WHERE NOT EXISTS(SELECT * FROM orders oo WHERE NOT oo.status=0 AND oo.user_id=u.id) 2) Каких записей всего или относящихся к этому юзеру?
Re: В лоб. Сел разбираться, вот что у меня вышло: 1) a)[sql]SELECT * FROM `users` WHERE user_id NOT IN ( SELECT user_id FROM `orders` WHERE status <> 0 )[/sql] б)[sql] SELECT u.* FROM `orders` o JOIN `users` u ON u.user_id = o.user_id WHERE o.status = 1 GROUP BY o.user_id HAVING COUNT(o.status) = 0[/sql] 2)[sql] SELECT u.* FROM `orders` o JOIN `users` u ON u.user_id = o.user_id WHERE o.status = 1 GROUP BY o.user_id HAVING COUNT(o.status) > N[/sql] Выходит, что варианты 1-б и 2 самые оптимальные. и красивые