【问题标题】:SQL where everything elseSQL 其他一切
【发布时间】:2009-07-13 22:13:02
【问题描述】:

考虑两个数据库表,ReportsReports_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 只有一个属性,所以没关系。

我尝试了很多东西,但我没有更多的想法。非常感谢。

【问题讨论】:

  • 表 Reports_has_properties 的 id_report 1 的属性 red 和 big ,所以我想要的是只选择只有 red 属性的行

标签: mysql join


【解决方案1】:
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报表属性。

【讨论】:

    【解决方案2】:

    很难说出你所追求的结果。

    如果你想要所有的红色:

    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;
    

    【讨论】:

      【解决方案3】:

      我不是要明确你在寻找什么......

      此查询将返回具有“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'
                            )
      

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 2014-02-08
        • 2013-10-30
        • 1970-01-01
        • 2011-02-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多