За последние 24 часа нас посетили 20113 программистов и 1695 роботов. Сейчас ищут 1863 программиста ...

Выбор пользователей по зн. из другой таблицы

Тема в разделе "MySQL", создана пользователем YaRosh, 3 июн 2010.

  1. YaRosh

    YaRosh Активный пользователь

    С нами с:
    6 июл 2009
    Сообщения:
    8
    Симпатии:
    0
    Добрый день.
    Назрело у меня два вопроса по 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
    Как правильно прописать ума не приложу.
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В лоб.

    Выбираем всех пользователей у которых все записи 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]
     
  3. YaRosh

    YaRosh Активный пользователь

    С нами с:
    6 июл 2009
    Сообщения:
    8
    Симпатии:
    0
    Re: В лоб.

    Спасибо.
    Пойду учить вложенные запросы.
    П.с. думал, что можно реализовать без вложенных запросов.
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Re: В лоб.

    Может и можно. Это ж решение "в лоб". Вполне вероятно, что существуют более красивые решения.
     
  5. Scorpius

    Scorpius Активный пользователь

    С нами с:
    6 май 2010
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    там уже нет
    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) Каких записей всего или относящихся к этому юзеру?
     
  6. YaRosh

    YaRosh Активный пользователь

    С нами с:
    6 июл 2009
    Сообщения:
    8
    Симпатии:
    0
    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 самые оптимальные. и красивые