Получить уникальные данные в запросе SQL - PullRequest
0 голосов
/ 26 мая 2010

У меня есть база данных, которая содержит некоторые данные в этой форме:

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')

Итак, как вы видите, поле имени не уникально. У меня может быть несколько значков с одинаковым именем, и они разделены полем размера. Теперь в 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());

В этом примере, если $ tag содержит 'twitter', будет отображаться ТОЛЬКО первая запись данных SQL с тегом 'twitter', поэтому это будет:

(myicon.png, 16, 'twitter')

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

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 26 мая 2010

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

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 голосов
/ 26 мая 2010

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

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 trick

С

0 голосов
/ 26 мая 2010

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

ORDER BY case when size=128 then 999999 else size end DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...