5

項目プロパティのテーブルと、次のように構成された user_favorites のテーブルがあります。

  • ID
  • item_id
  • ユーザーID
  • お気に入り (ブール値)

ユーザーがアイテムを「お気に入り」にすると、アイテム ID とユーザー ID を使用してこのテーブルに行が追加され、お気に入りのプロパティが 1 に設定されます (「お気に入りから外す」場合は 0 に変更されます)。

ユーザーが製品のリストを表示するときに、ユーザーのお気に入りを表示する方法を理解しようとしています。

現在、ユーザーの検索入力に基づいてクエリを実行し、製品 ID の配列を取得しています。ここで、これらの製品間でクエリを実行して、製品情報のテーブルを作成したいと考えています。また、そのアイテムがユーザーのお気に入りであるかどうかを含めたいと考えています。

私はこのようなことを試しました:

select i.tid, i.name as name, i.image as image,  (SELECT favorite FROM user_favorites WHERE user_id=77 ) as favorite
    FROM items i 

    left join user_favorites ufav on (ufav.item_id = i.tid)
    WHERE i.tid IN (79, 98, 105 . . .) 
    order by favorite DESC, name ASC

..しかし、もちろん、Subquery returns more than 1 rowエラーが発生します

私も次のようなことを試しました:

   select i.tid, i.name as name, i.image as image,  ufav.favorite as favorite
    FROM items i 
    left join user_favorites ufav on (ufav.item_id = i.tid)
    WHERE i.tid IN (79, 98, 105 . . .) AND ufav.user_id=77
    order by favorite DESC, name ASC

. . . ただし、これはお気に入りのアイテムのみを返します (ご想像のとおり)。ID のリストにあるすべてのアイテムを返したいのですが、「お気に入り」にされていないアイテムも知りたいです。

これを 1 つのクエリで実行できますか、それとも 2 つの個別のクエリを実行するのが最善の方法ですか?

4

3 に答える 3

1

これを試して ::

select 
i.tid, 
i.name as name, 
i.image as image,  
ifnull(favorite,false) as isFavorite

FROM items i 
left join user_favorites ufav on (ufav.item_id = i.tid)
WHERE i.tid IN (79, 98, 105 . . .)  and ufav.user_id=77
    order by favorite DESC, name ASC
于 2012-11-15T05:23:22.727 に答える
1

CROSS JOINすべてのアイテムをすべてのユーザーに表示したいので、ここで使用する必要があると思います。例

SELECT  d.item_ID, d.Itemname, d.user_ID, 
        COALESCE(c.`favorite`, 0) Favorite
FROM
        (
          SELECT   a.item_ID, a.Itemname, b.user_ID
          FROM     items a CROSS JOIN 
                   (
                       SELECT DISTINCT user_ID
                       FROM user_favorites
                   ) b
        ) d LEFT JOIN user_favorites c
            ON c.item_ID = d.item_ID AND
              c.user_ID = d.user_ID
-- WHERE d.user_ID = 1        -- this is you condition
ORDER BY d.user_ID, d.Item_ID
于 2012-11-15T05:24:58.253 に答える
0

これが私がとったアプローチです:

(
    SELECT i.tid, i.name as name, i.image, 1 AS favorite
    FROM items i
    LEFT JOIN user_favorites ufav on (ufav.item_id = i.tid)
    WHERE ufav.user_id = //the user id
    AND i.tid IN (79, 98, 105 . . .) 
 )

UNION DISTINCT

 (
     SELECT i.tid, i.name as name, i.image as image, 0 AS favorite
     FROM items i 
     WHERE NOT EXISTS (SELECT *
                       FROM user_favorites ufav
                       WHERE ufav.item_id = i.tid
                       AND ufav.user_id = //the user id
                       AND ufav.favorite=1
                       )
     AND i.tid IN (79, 98, 105 . . .)  
  ) 
  ORDER BY favorite DESC , i.name ASC

これに問題はありますか?これまでのところ、私が望んでいたように機能しているようです...

于 2013-02-01T05:01:51.307 に答える