5

我有一个项目属性表和一个 user_favorites 表,其结构如下:

  • ID
  • item_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

..但当然我得到一个子查询返回超过 1 行错误

我也尝试过这样的事情:

   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 列表中的所有项目,但我也想知道哪些项目没有被“收藏”。

我可以在一个查询中执行此操作,还是我最好的选择是运行两个单独的查询?

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 回答