SQL где все остальное - PullRequest
0 голосов
/ 14 июля 2009

Рассмотрим две таблицы базы данных, Reports и Reports_has_properties

Reports
------
id_report
1
2
3

Reports_has_properties
----------------------
id_report property
1         red
1         big
2         orange
3         blue
3         tiny

Проблема: например, я получаю только отчеты со свойством red, но запрос возвращает все id_report, которые соответствуют id_report

SELECT * FROM reports
INNER JOIN reports_has_properties
    ON reports_has_properties.id_report = reports.id_report
WHERE reports_has_properties.property = 'red'

Логическое объяснение: ЕСЛИ reports_has_properties ИМЕЕТ ID_report с другим свойством, не выбирайте его! У id_report 1 свойство красное и большое, так что это не хорошо. Но если я ищу свойство orange, у id_report 2 есть только одно свойство, так что все в порядке.

Я много чего пробовал, но идей больше нет. Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 14 июля 2009
SELECT *
FROM reports
INNER JOIN reports_has_properties
    ON reports_has_properties.id_report = reports.id_report
WHERE reports_has_properties.property = 'red'

совпадает с:

SELECT *
FROM reports
INNER JOIN reports_has_properties
    ON reports_has_properties.id_report = reports.id_report
    AND reports_has_properties.property = 'red'

что не совпадает с

SELECT *
FROM reports
LEFT JOIN reports_has_properties
    ON reports_has_properties.id_report = reports.id_report
    AND reports_has_properties.property = 'red'

Я не уверен, к каким результатам вы стремитесь.

Я думаю, вы можете стремиться к:

SELECT *
FROM reports
INNER JOIN reports_has_properties
    ON reports_has_properties.id_report = reports.id_report
WHERE reports.id_report IN (
    SELECT reports_has_properties.id_report
    FROM reports_has_properties
    WHERE reports_has_properties.property = 'red'
)

т.е. получить ALL свойства отчета для всех отчетов, имеющих свойство red.

0 голосов
/ 14 июля 2009

Мне не понятно, что вы ищете ...

Этот запрос вернет все отчеты со свойством «red» и всеми другими свойствами для этого report_id.

SELECT R.*,P.property
  FROM reports R
     , reports_has_properties P
 WHERE R.id_report = P.id_report
   AND R.id_report in (select distinct id_report 
                         from reports_has_properties 
                        where property='red'
                      )
0 голосов
/ 14 июля 2009

Трудно сказать результаты, которые вы после.

Если вы хотите все красные:

SELECT * FROM reports R
INNER JOIN reports_has_properties P
    ON P.id_report = R.id_report
WHERE P.property  = 'red';

Если вы хотите все 3:

SELECT * FROM reports R
INNER JOIN reports_has_properties P
    ON P.id_report = R.id_report
WHERE P.id_report = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...