6

ユニークな都市を持ち、それが首都であるかどうかを気にしないユニークな行/レコードのみを取得する方法を知りたいので、たとえば次のようにします。

Akron
akron
aKRON

1つのレコードのみを返します。

私はこのようなものを疲れましたが、それは機能しません

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

ありがとうございました...

4

4 に答える 4

10

この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

他のデータベースは、groupbyまたはそのようなメッセージにリストされていない非集計列があると文句を言います。

編集済み

以前upper()、グループ化された列で関数を使用しないと、すべての大文字小文字のバリエーションが返されると主張しましたが、それは正しくありませんでした。SalmanAがそれを指摘してくれたおかげです。SQLFiddleを使用して検証しましたが、を使用する必要はありませんupper()

于 2012-12-11T19:36:32.113 に答える
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 に答える
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 に答える