【问题标题】:Error using SELECT DISTINCT() with ORDER BY将 SELECT DISTINCT() 与 ORDER BY 一起使用时出错
【发布时间】:2017-09-24 12:43:08
【问题描述】:

我在将 SELECT DISTINCT() 与 ORDER BY... 结合使用时遇到问题... 这是我的 SQL:

SELECT DISTINCT(t2)
FROM Table1 t1
JOIN Table2 t2 ON t1.t2 = t2.id
JOIN Table3 t3 ON t1.t3 = t3.id
JOIN Table4 t4 ON t2.t4 = t4.id
JOIN Table5 t5 ON t2.t5 = t5.id
JOIN Table6 t6 ON t2.t6 = t6.id
ORDER BY t4.date DESC

但这是错误的......你有什么想法吗?

提前致谢! =)

【问题讨论】:

  • 怎么了?你在期待什么? t2 在哪个表?使用与列名匹配的表别名是个坏主意。
  • DISTINCT 是关键字,而不是函数。它适用于整个 SELECT 列表。 (t2 周围的括号是多余的)。 t4.date 的值在 ORDER BY 子句中不可用,因为它不包含在 SELECT DISTINCT 列表中。使用 GROUP BY 子句而不是 DISTINCT。

标签: mysql sql database select sql-order-by


【解决方案1】:

SELECT DISTINCT 查询中,您只能按SELECT 中的列排序。毕竟,date 的什么值应该用于排序?

好吧,我可能猜到了。 . .最大值。所以,使用聚合:

SELECT t2
FROM Table1 t1 JOIN
     Table2 t2 ON t1.t2 = t2.id JOIN
     Table3 t3 ON t1.t3 = t3.id JOIN
     Table4 t4 ON t2.t4 = t4.id JOIN
     Table5 t5 ON t2.t5 = t5.id JOIn
     Table6 t6 ON t2.t6 = t6.id
GROUP BY t2
ORDER BY MAX(t4.date) DESC;

【讨论】:

  • 我们希望对列 t2 的引用在 SELECT 列表和 GROUP BY 中都使用表别名 (t1.t2) 进行限定。 +10。
【解决方案2】:

您的 t2 只是您的表的别名,不能那样做:

应该是这样的:

SELECT DISTINCT t2.*,t3.*,t4.*
FROM Table1 t1
JOIN Table2 t2 ON t1.id = t2.id
JOIN Table3 t3 ON t1.id = t3.id
JOIN Table4 t4 ON t2.id = t4.id
JOIN Table5 t5 ON t2.id = t5.id
JOIN Table6 t6 ON t2.id = t6.id
ORDER BY t4.date DESC

如果您使用 *,则必须小心使用相同的列名,因为它会返回一个模棱两可的错误。您可以简单地喜欢 t3.column1 等等..

【讨论】:

  • 如果您的表 ID 与其每个表相关,则此查询仅返回一个结果。如果你愿意,你可以改变它。
【解决方案3】:

只做一个子查询

SELECT * FROM 
    (
    SELECT DISTINCT *
    FROM Table1 t1
    JOIN Table2 t2 ON t1.t2 = t2.id
    JOIN Table3 t3 ON t1.t3 = t3.id
    JOIN Table4 t4 ON t2.t4 = t4.id
    JOIN Table5 t5 ON t2.t5 = t5.id
    JOIN Table6 t6 ON t2.t6 = t6.id
    )
ORDER BY t4.date DESC

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多