0

私はその形式でいくつかのデータを含むデータベースを持っています:

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には、たとえば次のような1つのアイコンセットを取得するクエリがあります。

$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' が含まれている場合、タグ 'twitter' を持つ最初の SQL データ エントリのみが表示されるため、次のようになります。

(myicon.png, 16, 'twitter')

これは私が望んでいるものですが、デフォルトでは「128」サイズを好みます。存在する場合は128サイズのみを送信し、別のサイズでない場合はSQLに送信するように指示することは可能ですか?

別の質問では、誰かが GROUP BY を使用した解決策を教えてくれますが、この場合は GROUP BY という名前があるため実行されません。GROUP BY を削除すると、同じアイコンのすべてのサイズが表示されます。

ありがとう !

4

3 に答える 3

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

于 2010-05-26T11:49:34.497 に答える
0

この ORDER BY 句を試してください (id または size?):

ORDER BY case when size=128 then 999999 else size end DESC
于 2010-05-26T09:01:51.343 に答える
0

本当に必要なのは、最大サイズのレコードを取得することです。

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

しかし、ここで紛らわしいのは、「名前」が一意ではないことです。通常、このようなシナリオでは、最後の検針や最大の請求書など、最大 (または最小) が発生したレコードを特定したいと考えています。したがって、テーブルに id フィールドがあり、それを取得したい場合:

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.

于 2010-05-26T12:56:51.277 に答える