1

そのため、MySQL 3 テーブル、アイテム (この場合は宿泊施設であり、データは以下に単純化されています)、プロパティが提供する可能性のある設備、および提供される各設備の項目 ID と設備 ID のリストである_enquiry_index_があります。エンド ユーザーは必要なアメニティをいくつでも選択できます。探しているものに一致するアメニティの数の順に結果を返したいと考えています。したがって、ユーザーが 3 つの異なるアメニティを検索する場合、3 つすべてを提供するアイテム、次に 2 つ、1 つ、最後に残りのアイテムを提供するアイテムがリストに表示されます。結果を正しい順序で取得するために機能していると思われるクエリがありますが、一致に基づいてポイント値も返せることを望んでいましたが、そこで問題が発生しています。より複雑なクエリに関しては、SQL のスキルが少し不足しています。

正しい順序で結果を返すクエリの例を次に示します。

SELECT * FROM items 
ORDER BY 
(
     SELECT count(*) AS points 
     FROM `amenities_index` 
     WHERE 
       (amenity_id = 1 || amenity_id = 2) 
       AND amenities_index.item_id = items.id
) DESC

そして、これがテーブルの構造です。どんな助けでも大歓迎です。

items table
id  name    
1   location 1
2   location 2
3   location 3
4   location 4

amenities table
id  name
1   fireplace
2   television
3   handicapped accessible
4   kitchenette
5   phone

amenities_index
item_id amenity_id
1       2
1       3
1       5
2       1
2       2
2       6
3       2
3       3
3       4
3       5
4

1 に答える 1

1

select式を句に移動します。

SELECT i.*,
       (SELECT count(*) AS points 
        FROM `amenities_index` ai
        WHERE amenity_id in (1, 2) AND
              ai.item_id = i.id
       ) as points
FROM items i
ORDER BY points desc;

join集計を使用したクエリとしてこれを行うこともできます。

SELECT i.*, ai.points
FROM items i join
     (select ai.item_id, count(*) as points
      from amenities_index ai
      where amenity_id in (1, 2)
     ) ai
     on ai.item_id = i.id
ORDER BY ai.points desc;

ほとんどのデータベースでは、最初のバージョンよりもこのバージョンを好みます。ただし、MySQL は最初のビューを許可しますが、2 番目のビューは許可しないため、状況によっては奇妙な制限があります。

于 2013-08-29T14:09:57.303 に答える