Сложный SQL-запрос: правильное объединение четырех разных таблиц - PullRequest
0 голосов
/ 06 марта 2011

У меня есть 4 таблицы: users, userpreference, userinfo, useredu

последние три таблицы используют «id» в качестве внешнего ключа, ссылающегося на таблицу «users»:

Queryформулировка:

мне нужно найти «лучшую музыку среди всех одиноких женщин, которые ходят в МГУ»

, отмечая, что МГУ также может быть «Миннесота»Государственный университет "

У меня есть этот запрос, но он не дает правильных результатов?

select userpreference.preferencevalue as 'Music', COUNT(*) as 'SingleFemaleCount'from users, userpreference, userinformation
where users.Id = userinformation.Id
and users.Id = userpreference.Id
and userpreference.Id = userinformation.Id
and users.Gender = 'female'
and userinformation.informationvalue = 'single'
and usereducation.school like 'msu%' OR like 'minnesota state%'
and userpreference.preferencetype = 'music' GROUP BY preferencevalue ORDER BY      COUNT(distinct users.Id) DESC limit 10

Ответы [ 3 ]

1 голос
/ 06 марта 2011

Это может быть так просто, как вам нужны скобки в предложении where:

(usereducation.school like 'msu%' OR like 'minnesota state%')

В противном случае OR будет иметь более низкий приоритет, чем соседние AND.

РЕДАКТИРОВАТЬ: 2011-03-06

Ниже я отформатировал код, чтобы его было немного легче читать, а также переместил проверку userinformation и usereducation в предложения exists(). Я делаю это потому, что если у пользователя более 1 userinformation или usereductionat строк, соответствующих вашим критериям, это повлияет на совокупность count().

select
    userpreference.preferencevalue as 'Music',
    COUNT(*) as 'SingleFemaleCount'

from users, userpreference
where users.Gender = 'female'
  and userpreference.Id = users.Id
  and userpreference.preferencetype = 'music'

  and exists
    (select *
    from userinformation
    where userinformation.Id = users.Id
      and userinformation.informationvalue = 'single')

  and exists
    (select *
    from usereducation
    where usereducation.Id = users.Id
      and (usereducation.school like 'msu%' OR like 'minnesota state%'))

GROUP BY userpreference.preferencevalue
ORDER BY COUNT(*) DESC limit 10

Еще одна вещь, которую нужно проверить, это то, что (usereducation.school like 'msu%' OR like 'minnesota state%') действительно находит все записи MSU. Если набор результатов не слишком велик, запустите select distinct school from usereducation, чтобы проверить и убедиться, что вы получаете все записи.

Наконец, я предпочитаю использовать синтаксис объединения следующим образом:

select
    userpreference.preferencevalue as 'Music',
    COUNT(*) as 'SingleFemaleCount'

from users
inner join userpreference on userpreference.Id = users.Id
where users.Gender = 'female'
  and userpreference.preferencetype = 'music'

  and exists
    (select *
    from userinformation
    where userinformation.Id = users.Id
      and userinformation.informationvalue = 'single')

  and exists
    (select *
    from usereducation
    where usereducation.Id = users.Id
      and (usereducation.school like 'msu%' OR like 'minnesota state%'))

GROUP BY userpreference.preferencevalue
ORDER BY COUNT(*) DESC limit 10

Я понимаю, что полностью изменил ваш запрос, но эй, это домашняя работа, верно:)

0 голосов
/ 06 марта 2011

Хорошо, как только вы добавили usereducation в «FROM» и она присоединилась к таблице пользователей (вам не нужно присоединяться к другим таблицам, но, если хотите, используйте ее) Попробуйте ниже.

В запросе, если вы хотите найти столбец, равный тому или иному значению в предложении WHERE, вам нужно будет перечислить столбцы дважды:

AND (usereducation.school LIKE 'msu%' OR usereducation.school LIKE 'minnesota state%')
0 голосов
/ 06 марта 2011

Дана верна. Вам также необходимо добавить usereducation в предложение from:

from users, userpreference, userinformation, usereducation

и присоедините его к пользователям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...