2010-05-26 5 views
0

У меня есть базы данных, которые содержат некоторые ДАННЫЕ в такой форме:Получить уникальные данные в запросе SQL

icon(name, size, tag) 
(myicon.png, 16, 'twitter') 
(myicon.png, 32, 'twitter') 
(myicon.png, 128, 'twitter') 
(myicon.png, 256, 'twitter') 
(anothericon.png, 32, 'facebook') 
(anothericon.png, 128, 'facebook') 
(anothericon.png, 256, 'facebook') 

Так как вы его видите, поле имени не Uniq я могу иметь несколько значков с одно и то же имя, и они разделены полем размера. Теперь в PHP У меня есть запрос, получить один набор иконок, например:

$dbQueryIcons = mysql_query("SELECT * FROM pl_icon WHERE tag LIKE '%".$SEARCH_QUERY."%' GROUP BY name ORDER BY id DESC LIMIT ".$firstEntry.", ".$CONFIG['icon_per_page']."") or die(mysql_error()); 

В этом примере, если $ тег содержит «твиттер» будет показана только первая запись данных SQL с тегом «твиттере», так это будет:

(myicon.png, 16, 'twitter') 

Это то, что я хочу, но я бы предпочел размер «128» по умолчанию. Можно ли сказать, что SQL отправит мне только размер 128 при существующем и, если не другом размере?

В другом вопросе кто-то дает мне решение с GROUP BY, но в этом случае это не выполняется, потому что у нас есть имя GROUP BY. И если я удалю GROUP BY, он покажет мне все размеры одинаковых значков.

Спасибо!

ответ

0

Попробуйте предложения ORDER BY (идентификатор или размер?):

ORDER BY case when size=128 then 999999 else size end DESC 
1

Попробуйте использовать подзапросы.

SELECT * FROM (

    SELECT * FROM pl_icon 
    WHERE tag LIKE '%$SEARCH_QUERY%' 
    ORDER BY IF(size = 128, 0, 1) 

) pl_icon 
GROUP BY name 
ORDER BY id DESC 
LIMIT ... 

Мы находим все соответствующие строки во внутреннем запросе и размещаем строки с размером = 128 выше всех остальных. Затем для каждого уникального имени мы выбираем только первую запись, используя GROUP BY.

+0

Ницца, это бег! Спасибо !!! Просто одно. Я видел, что если нет 128-го размера, это показывает, например, первый из них 16. Можно иметь 128 или меньше? Например, если 128 не существует, он показывает мне 64 (если существует) или 32 или 16? Спасибо – Jensen

+0

@Jensen, да, это возможно: 'ORDER BY IF (size = 128, 0, 1), IF (размер <128, 0, 1), размер DESC' - это обеспечит следующий порядок:« 128; то все ниже 128 в порядке убывания, затем все выше 128 в порядке убывания », то есть« 128, 64, 32, 16, 256 » –

+0

Или еще лучше:' ORDER BY IF (размер <= 128, 0, 1) , размер DESC' :) –

0

Если то, что вы действительно хотите получить запись с наибольшим размером, то:

SELECT name, tag, MAX(size) 
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag 

Но что здесь смущает, что «имя» не является уникальным. Обычно в таких сценариях люди хотят идентифицировать запись, где происходит максимум (или минимум) - как последнее показание счетчика или самый большой счет-фактура. Так что, если ваша таблица была поле идентификатора, и вы хотели получить, что:

SELECT pl2.* 
FROM pl_icon pl2, 
(SELECT name, tag, MAX(size) AS biggest 
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag) ilv 
WHERE ilv.name=pl2.name 
AND ilv.tag=pl2.tag 
AND ilv.biggest=pl2.size; 

Однако это может быть весьма неэффективно для очень больших таблиц/выбирает - когда вы, возможно, захотите попробовать MAX(CONCAT трюк

C.

Смежные вопросы