我正在使用我的SQL从数据库中获取唯一值
我的查询如下所示,但不知怎的,我无法获得独特的结果
SELECT
DISTINCT(company_name),
sp_id
FROM
Student_Training
ORDER BY
company_name
Run Code Online (Sandbox Code Playgroud)
sp_id是主键,然后company_name是需要唯一的公司名称
看起来如下
sp_id, company_name
1 comp1
2 comp2
3 comp2
4 comp3
Run Code Online (Sandbox Code Playgroud)
只是不排序这个独特的
DISTINCT在您选择的所有列上全局工作.在这里你得到不同的对(sp_id的,COMPANY_NAME)的值,但每一列的各个值可能会出现重复.
话虽如此,MySQL SELECT DISTINCT(company_name), sp_id真正意味着授权语法是非常具有欺骗性的SELECT DISTINCT(company_name, sp_id).顺便说一句,你根本不需要括号.
编辑
实际上有一个原因DISTINCT(company_name), sp_id是为什么有效的语法:在表达式周围添加括号总是合法的,尽管它可能是过度的:company_name是相同的(company_name)甚至是相同的(((company_name))).因此,这段SQL意味着什么:"DISTINCT [括号中的company_name],[sp_id]".括号附加到列名称,而不是DISTINCT关键字,与聚合函数名称不同,例如,不需要括号(AVG sp_id即使对于人类读者来说是明确的,也是不合法的,它始终是 AVG(sp_id).)
就此而言,您可以编写SELECT DISTINCT company_name, (sp_id)或者SELECT DISTINCT (company_name), (sp_id),它与没有括号的普通语法完全相同.将列列表放在括号内 - (company_name, sp_id)- 不是合法的SQL语法,但是,你只能选择"普通"列列表,不加表示(表单的拼写检查器告诉我这最后一个表达式不是英文单词,但我不是照顾.毕竟是星期五下午).
因此,任何数据库引擎都应该接受这种令人困惑的语法:-(
DISTINCT 将创建唯一的行,这意味着查询中字段值的唯一组合.
以下查询将返回所有唯一company_name的列表以及sp_id的第一个匹配项.
SELECT sp_id, company_name
FROM Student_Training
GROUP BY company_name
Run Code Online (Sandbox Code Playgroud)
正如Arthur Reutenauer所暗示的那样,MySQL DISTINCT(fieldname)在实际意义上允许语法确实是非常具有欺骗性的DISTINCT(field1, field2, ..., fieldn)