【问题标题】:PHP MySQL Select data from two tables and Order by a field from a third tablePHP MySQL从两个表中选择数据并按第三个表中的字段排序
【发布时间】:2013-01-21 23:19:44
【问题描述】:

请给我以下表格

Field
+----+--------+----------+---------------------+
| id | name   | Type     | date                |
+----+--------+----------+---------------------+
|  1 |  price | int      | 2009-09-02 00:07:07 |
|  2 |  width | float    | 2009-09-02 00:07:08 |
|  3 |  height| float    | 2009-09-02 00:07:30 |
+----+--------+--------------------------------+


Post
+----+--------+---------------------------------+
| id |title   | Body                            |
+----+--------+---------------------------------+
|  1 |  test  | Bla bla bla                     |
|  2 | Hello  | Bla bla bla                     |
|  3 | Its me | Bla bla bla                     | 
+----+--------+---------------------------------+


Post_Annex
+----+--------+----------+---------------------+
| id | IdPost | IdField  | Value               |
+----+--------+----------+---------------------+
|  1 |  1     | 1        | 50                  |
|  2 |  1     | 2        | 21                  |
|  3 |  1     | 3        | 3                   |
|  4 |  2     | 1        | 10                  |
|  5 |  2     | 2        | 2                   |
|  6 |  2     | 3        | 150                 |
|  7 |  3     | 1        | 1                   |
|  8 |  3     | 2        | 25                  |
|  9 |  3     | 3        | 15                  |
+----+--------+--------------------------------+

我希望从 PostPost_Annex 表中选择数据,按 Post 表的 ID 对它们进行分组并按价格排序(这意味着通过 IdField当 Post_Annex 表等于 1 时)。所以这是我的查询:

SELECT p.title
    FROM Post p
    LEFT JOIN Post_Annex pa
       ON p.id = pa.IdPost

    GROUP BY p.id

    ORDER BY case when pa.IdField = 1 then 0 else 1, pa.Value DESC

这给了我这个顺序的结果:its Me | Hello | test

这很好。但即使我尝试按宽度(IdField = 2)或高度(IdField = 3)排序,它也给了我相同的结果。

请掌握任何想法来帮助我解决这个问题?提前致谢。

【问题讨论】:

    标签: php mysql group-by sql-order-by


    【解决方案1】:

    我只想修改 join 子句,指定要排序的字段:

    SELECT p.title
    FROM Post p
         LEFT JOIN Post_Annex pa
         ON p.id = pa.IdPost
            AND pa.idfield=1
    ORDER BY pa.Value DESC
    

    然后您不必按 p.id 分组。

    您的查询并不总是有效,因为您按 p.id 分组,但您正在选择(并按顺序排序)其他非聚合列,并且这些列的值可以是 undetemined

    【讨论】:

    • 顺序正确,但它返回了 4 个结果而不是 3 个 :( (重复一个结果)。谢谢
    • @SamiElHilali 你有一些重复的值吗?或者您可能需要inner join 而不是left join?使用您的示例数据,它看起来可以工作sqlfiddle.com/#!2/70802/3
    • 是的,我有第三张桌子,但我只是离开 group by 并添加 AND pa.idfield=1 并且效果很好. (我认为Mysql扩展了命令)谢谢你的解释和帮助。 +1
    【解决方案2】:

    在一个简单的 SQL 中,避免 group by 和 case when's:

    SELECT p.title
    FROM Post p, Post_Annex pa
    WHERE p.id = pa.IdPost
    AND pa.IdField = 1
    ORDER BY pa.Value DESC
    

    你可以这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多