2009-07-13 3 views
0

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

Reports 
------ 
id_report 
1 
2 
3 

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

Проблема: я только получаю только отчеты со свойством красного, например, но запрос возвращает все 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' 

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

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

+0

ошибка ... какой? да? – rball

+0

Таблица Reports_has_properties имеет свойство red и big для id_report 1, поэтому я хочу выбрать только строки с только красным свойством – 2009-07-14 03:56:23

ответ

2
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' 
) 

т.е. получить ВСЕХ свойства отчета для любых отчетов, которые имеют красную собственность.

0

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

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

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; 
0

Я не ясно, что вы ищете ...

Этот запрос возвращает все отчеты с «красным» свойством и всеми другими свойствами для этого 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' 
        ) 
Смежные вопросы