DISTINCT的另一种方式

时间:2008-12-18 19:01:17

标签: mysql

我有像这样的SQL语句

SELECT DISTINCT results_sp_08.material_number FROM results_sp_08
        INNER JOIN courses ON results_sp_08.material_number = courses.material_number
        INNER JOIN users ON results_sp_08.id = users.id
        AND results_sp_08.doctor = 'xx260'

我需要DISTINCT的替代方法在MySQL版本中使用它:4.1.22?

还有另一种方式或伎俩吗?

8 个答案:

答案 0 :(得分:3)

DISTINCT在功能上等同于GROUP BY <all the columns in your select list>

答案 1 :(得分:2)

与Joel一样,您最好的选择是添加GROUP BY子句。在你的情况下

GROUP BY results_sp_08.material_number

答案 2 :(得分:0)

我通常在这些上使用双连接策略:

JOIN tablex AS x1 ON whatever  
LEFT JOIN tablex AS x2 ON whatever  
    AND x2.pkid < x1.pkid AND x2.somefield IS NULL

保证我在所有联接中最多获得1条记录。

答案 3 :(得分:0)

我过去通过在WHERE中添加更多子句成功地消除了DISTINCT。您需要查看JOIN中的哪些字段导致多行返回。子查询也可以起作用。

答案 4 :(得分:0)

我需要DISTINCT选择非重复元素,例如我在一列中包含这些值(EE432 - EE432 - EE352 - EE352)我的sql语句将只返回EE432和EE352。

所以我需要替代方法来做到这一点

答案 5 :(得分:0)

在不知道表格结构的情况下,很难说清楚。 你需要用语言说出你想要做的事情。

假设result_sp_08仅包含唯一的“material_number”,并且 您正在尝试获取在课程和用户表中至少有一行的所有唯一material_number:

SELECT results\_sp\_08.material\_number
FROM results\_sp\_08
WHERE results\_sp\_08.doctor = 'xx260' and
EXISTS(select * from courses
    where results\_sp\_08.material\_number = courses.material\_number) and
EXISTS(select * from users
    where results\_sp\_08.id = users.id)

请参阅文档:http://dev.mysql.com/doc/refman/4.1/en/exists-and-not-exists-subqueries.html

答案 6 :(得分:0)

我认为我们在这里遗漏了一些重要信息。 DISTINCT在mysql 4.1.22中完全有效,那你为什么还需要另一种选择呢?

material_number列是否包含文字字符串“EE432 - EE432 - EE352 - EE352”,或者您的查询是否返回4行?如果它是一个字符串,那么没有多少SQL可以帮助你。

答案 7 :(得分:0)

SELECT results_sp_08.material_number FROM results_sp_08
       INNER JOIN courses AS c ON
       results_sp_08.material_number = c.material_number
       INNER JOIN users AS u ON results_sp_08.id = u.id
       AND results_sp_08.doctor = 'xx260'
GROUP BY results_sp_08.material_number.

添加了group by子句,并删除了不重复的。最佳实践之一:使用JOIN时始终使用别名。