我正在使用我的sql从数据库中获取唯一值
我的查询如下所示,但不知怎的,我无法获得独特的结果
SELECT
DISTINCT(company_name),
sp_id
FROM
Student_Training
ORDER BY
company_name
sp_id是主键,然后company_name是需要唯一的公司名称
如下所示
sp_id, company_name
1 comp1
2 comp2
3 comp2
4 comp3
不要排序这个独特的
答案 0 :(得分:7)
DISTINCT全局运行, all 您选择的列。在这里,您将获得(sp_id,company_name)值的不同对,但每列的各个值可能会显示重复。
话虽如此,当它真正意味着SELECT DISTINCT(company_name), sp_id
时,MySQL授权语法SELECT DISTINCT(company_name, sp_id)
是非常具有欺骗性的。顺便说一句,你根本不需要括号。
修改强>
实际上DISTINCT(company_name), sp_id
是有效语法的原因是:在表达式周围添加括号总是合法的,尽管它可能过度:company_name
与(company_name)
或{{1}相同}}。因此,这段SQL意味着什么:“DISTINCT [括号中的company_name],[sp_id]”。括号附加到列名,而不是DISTINCT关键字,与聚合函数名称不同,例如,不需要括号((((company_name)))
即使对于人类读者来说是明确的,也是不合法的,它总是 AVG sp_id
。)
就此而言,您可以编写AVG(sp_id)
或SELECT DISTINCT company_name, (sp_id)
,它与没有括号的普通语法完全相同。将列列表放在括号中 - SELECT DISTINCT (company_name), (sp_id)
- 不是合法的SQL语法,但是,你只能选择“普通”列列表,不加表示(表单的拼写检查器告诉我这最后一个表达式不是英文单词但是我不在乎。毕竟是星期五下午。
因此,任何数据库引擎都应该接受这种令人困惑的语法: - (
答案 1 :(得分:6)
DISTINCT
将创建唯一的行,这意味着查询中字段值的唯一组合。
以下查询将返回所有唯一company_name的列表以及sp_id的第一个匹配项。
SELECT sp_id, company_name
FROM Student_Training
GROUP BY company_name
正如Arthur Reutenauer所暗示的那样,当它实际意味着DISTINCT(fieldname)
时,MySQL允许使用DISTINCT(field1, field2, ..., fieldn)
语法,这确实是一种欺骗
答案 2 :(得分:3)
如果单个id
有两个或更多个company_name
,您需要哪个id
?
此:
SELECT DISTINCT company_name
FROM Student_Training
将仅选择company_name
。
此:
SELECT company_name, MIN(id)
FROM Student_Training
GROUP BY
company_name
将为每个公司名称选择最小id
。
答案 3 :(得分:2)
DISTINCT不像您认为的那样工作。它为您提供了独特的记录。停下来想想它如何能够回归你期望它返回的东西。如果你有一个表格如下
id name
1 joe
2 joe
3 james
如果它只返回不同的名字,那么它会返回哪个id为joe?
你可能想要
SELECT company_name, Min(sp_id) FROM Student_Tracking GROUP BY company_name
或者(如上所述)只是
SELECT DISTINCT company_name from student_training