Select only unique row/record in mysql

后端 未结 4 477
我在风中等你
我在风中等你 2021-01-12 21:47

I would like to see how I can get only unique row/records that have a unique city and not care if it\'s capital so for example:

Akron
akron
aKRON

相关标签:
4条回答
  • 2021-01-12 22:31

    You can us a function in a GROUP BY to convert all names to upper or lowercase:

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

    I'm assuming if a city and state match, lattitude and longitude can be safely rolled up.

    0 讨论(0)
  • 2021-01-12 22:35

    It doesn't work on other DBMS, but in MySql you could use this:

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

    MySql ignores case when comparing strings, e.g. this returns true:

    select 'hello'='Hello '
    

    and you can also group by a single field (city in this case) and return all others field. Values of other fields are undetermined, they are usually the ones in the first row but you can't relay on that.

    0 讨论(0)
  • 2021-01-12 22:39

    You can use this mysql-only trick:

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

    This will return the first row encountered for each unique value of city and state_prefix.

    Other databases will complain that you have non=-aggregated columns not listed in the group by or some such message.

    Edited

    Previously I claimed that not using the upper() function on the grouped-by columns it would return all case variations, but that was incorrect - thanks to SalmanA for pointing that out. I verified using SQLFiddle and you don't need to use upper().

    0 讨论(0)
  • 2021-01-12 22:47

    It's possible your table, or your city column, has a case-sensitive collation setting.

    You can choose the collation explicitly in your SELECT statement like so. If you choose a case-insensitive collation, the DISTINCT keyword will do what you want it to do.

    SELECT DISTINCT
            city COLLATE utf8_general_ci,
            state_prefix COLLATE utf8_general_ci,
            lattitude,longitude  
     FROM zip_code 
    WHERE city LIKE '$queryString%' 
    LIMIT 10
    
    0 讨论(0)
提交回复
热议问题