6

我想看看如何只获得具有独特城市的独特行/记录,而不关心它是否是首都,例如:

Akron
akron
aKRON

只会返回一条记录。

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

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

谢谢...

4

4 回答 4

10

您可以使用这个 mysql-only 技巧:

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

其他数据库会抱怨您有未在 group by 或某些此类消息中列出的 non=-aggregated 列。

已编辑

以前我声称不使用upper()分组列上的函数会返回所有大小写变化,但这是不正确的 - 感谢 SalmanA 指出这一点。我使用 SQLFiddle 进行了验证,您不需要使用upper().

于 2012-12-11T19:36:32.113 回答
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 '

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

于 2012-12-11T19:34:39.313 回答
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

我假设如果一个城市和州匹配,纬度和经度可以安全地卷起。

于 2012-12-11T19:36:38.973 回答
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
于 2012-12-11T19:48:02.327 回答