2

そこで、MySQLで検索することにしました...

SELECT * 
FROM items AS i 
INNER JOIN tags AS t ON i.id = t.item_id 
WHERE item LIKE ('%s%' OR '%s2%' ... OR '%sn%') 
  AND tag LIKE ('%s%' OR '%s2%' ... OR '%sn%');

全文ではありません。項目は VARCHAR(32)、タグは VARCHAR(16) です。

結果の順序付けに問題があります... 1 つの検索文字列に関しては優先順位を直接取得できますが、それ以上になると、少しでたらめになり、(検索文字列の数)+7 クエリになってしまい、私は感じます使ってて本当に汚い。実際に使ってたわごとを浴びるよりも汚く感じます.これはどのように見えるか.

SELECT 
    t1.item_id, t1.item, t1.created, t1.owner, t1.type, t1.fld, t2.tag
FROM 
    items AS t1
INNER JOIN 
    tagged AS t2 ON t1.item_id = t2.item_id
WHERE 
    (item LIKE '%red%' OR '%apple%')
GROUP BY 
    item_id
ORDER BY 
    CASE 
       WHEN item = 'red'
         THEN 0 
       WHEN item = 'apple'
         THEN 1 
       WHEN (item LIKE 'red%' OR 'apple%')
         THEN 2 
       WHEN (item LIKE '%red%' AND '%apple%') 
        AND (tag LIKE '%red%' AND '%apple%')
        THEN 3 
      WHEN (item LIKE '%red%' AND '%apple%')
       AND (tag LIKE '%red%' OR '%apple%')
        THEN 4 
      WHEN (item LIKE '%red%' AND '%apple%')
        THEN 5 
      WHEN (item LIKE '%red%' OR '%apple%')
       AND (tag LIKE '%red%' OR '%apple%')
        THEN 6 
      WHEN (item LIKE '%red%' OR '%apple%')
        THEN 7 
      WHEN (tag LIKE '%red%' OR '%apple%')
        THEN 8 
      ELSE 9 
    END ASC , 
    created DESC 
LIMIT 0 , 30

ええ、それはとても汚いです、どうすればそれを切ることができますか? 私は実際に、検索文字列からそのクエリを生成する PHP スクリプトを使用しています。そのクエリは、順序付けのないクエリよりも少しだけ遅く、負荷が高くなりませんが、私にとっては汚いと感じます。これを行うよりエレガントな方法はありますか?

4

1 に答える 1

0

私はケースを押したいと思います...いつ節を選択するか。私のクエリは次のようになります。

SELECT field1, field2,
case 
 when field1 like 's1%' then 1
 when field1 like 's2%' then 2
end as ordering_field
from table_name
group by field1
order by ordering_field
于 2013-03-13T17:23:05.070 に答える