2013-02-19 3 views
0

Я хочу, чтобы родитель должен быть уникальным из этого запроса:Уникальные результаты запросов MySQL

select 
    *, 
    (select state_name 
    from tbl_states 
    where state_id = tbl_cities.parent_id) as parent 
from 
    tbl_cities 
ORDER BY 
    parent 

Я пытался использовать:

select 
    *, 
    DISTINCT (select state_name 
      from tbl_states 
      where state_id = tbl_cities.parent_id) as parent 
from 
    tbl_cities 
ORDER BY 
    parent 

но он дает ошибку.

+0

какая ошибка? – scunliffe

+1

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DISTINCT» (выберите state_name из tbl_states, где state_id = tbl_cities.parent_i »в строке 1 –

+0

Возможный дубликат [MySQL Как вернуть уникальные/отличительные результаты?] (http://stackoverflow.com/questions/4663181/mysql-how-to-return-unique-distinct-results) –

ответ

0

Условное обозначение неверно. Вы хотите

select DISTINCT * ... 
+0

Но он только хочет, чтобы «родитель» был уникальным, верно? – bernie

+0

Да, это родитель, который должен быть уникальный –

0

Синтаксически, вы должны положить DISTINCT в суб-выберите:

select * , 
(select DISTINCT state_name 
    from tbl_states 
    where state_id = tbl_cities.parent_id) as parent 
from tbl_cities ORDER BY parent 

Я не понимаю, почему вы получите несколько состояний, действительно ли они повторили то же самое состояние? Если есть разные состояния, тогда у вас другая проблема. В этом случае, следующий будет работать, насколько синтаксис идет:

select * , 
(select MAX(state_name) 
    from tbl_states 
    where state_id = tbl_cities.parent_id) as parent 
from tbl_cities ORDER BY parent 

Но семантика может быть неправильной для ваших требований.

0

Повторите запись и получите дополнительную выгоду от соответствия ANSI.

select 
    c.*, parent.state_name 
from 
    tbl_cities c 
    left join (
    select 
     state_id, state_name 
    from 
     tbl_states 
    group by 
     state_id, state_name 
) as parent 
    on parent.state_id = c.parent_id 
order by 
    parent.state_name; 
Смежные вопросы