在mysql中只选择唯一的行/记录

时间:2012-12-11 19:32:07

标签: mysql sql

我想知道如何才能获得具有独特城市的独特行/记录,而不关心它是否是资本,例如:

Akron
akron
aKRON

只会返回一条记录。

我厌倦了这样的事情,但它不起作用

"SELECT DISTINCT(city) AS city,state_prefix,lattitude,longitude  FROM zip_code WHERE city LIKE '$queryString%' LIMIT 10"

谢谢...

4 个答案:

答案 0 :(得分:11)

你可以使用这个仅限mysql的技巧:

SELECT city, state_prefix, lattitude,longitude
FROM zip_code WHERE city LIKE '$queryString%'
GROUP BY city, state_prefix -- Here's the trick
LIMIT 10

这将为citystate_prefix的每个唯一值返回遇到的第一行

其他数据库会抱怨您有非= -aggregated列未在组中列出或者某些此类消息。

被修改

之前我声称不在分组列上使用upper()函数,它会返回所有案例变体,但这是不正确的 - 感谢SalmanA指出了这一点。我使用SQLFiddle进行了验证,您不需要使用upper()

答案 1 :(得分:2)

它不适用于其他DBMS,但在MySql中你可以使用它:

SELECT city, state_prefix,lattitude,longitude
FROM zip_code WHERE city LIKE '$queryString%'
GROUP BY city
LIMIT 10

MySql在比较字符串时忽略大小写,例如这返回true:

select 'hello'='Hello '

您还可以按单个字段(在本例中为城市)进行分组,并返回所有其他字段。其他字段的值未确定,它们通常是第一行中的值,但您无法继续进行中断。

答案 2 :(得分:2)

您可以在GROUP BY中使用函数将所有名称转换为大写或小写:

 SELECT  city,state_prefix,lattitude,longitude 
        FROM zip_code WHERE city LIKE '$queryString%'
        GROUP BY UPPER(city), UPPER(state_prefix) LIMIT 10

我假设一个城市和州的比赛,经度和经度可以安全地汇总。

答案 3 :(得分:2)

您的表格或城市列可能具有区分大小写的排序规则设置。

您可以像这样在SELECT语句中显式选择排序规则。如果您选择不区分大小写的排序规则,DISTINCT关键字将执行您希望它执行的操作。

SELECT DISTINCT
        city COLLATE utf8_general_ci,
        state_prefix COLLATE utf8_general_ci,
        lattitude,longitude  
 FROM zip_code 
WHERE city LIKE '$queryString%' 
LIMIT 10