我正在尝试创建一个用户收藏系统,但很难创建一个完成我需要的查询。我将以水果为例。
首先,这是我的fruitsinfo
桌子:
id | color | rating
apples red 8.4
oranges orange 9.1
blueberries blue 8.8
pineapple yellow 7.9
peaches orange 8.3
然后是currentfruit
表格,它只列出了当季水果并有当前市场价格(这个数据非常糟糕,但请耐心等待):
id | price | months left in season
apples 1.25 6
avocados 1.42 4
pears 1.24 3
oranges 1.75 5
blueberries 2.20 4
最后,一个userfavorites
包含用户 ID 和水果 ID 的表:
userid | fruitid
5 apples
5 peaches
5 pears
我们将只使用 userid = '5' 的用户。这里需要注意几点:并非所有条目currentfruits
都在 in 中fruitsinfo
,也不是所有条目userfavorites
都在 in 中currentfruits
。
当用户通常在没有保存收藏夹的情况下访问该站点时,他们只会看到currentfruits
左连接fruitsinfo
并按价格排序,如下所示:
id | price | months left in season | color | rating
blueberries 2.20 4 blue 8.8
oranges 1.75 5 orange 9.1
avocados 1.42 4 null null
apples 1.25 6 red 8.4
pears 1.24 3 null null
现在,我想要检查表中是否有用户最喜欢的水果currentfruits
,然后首先列出这些结果(按价格排序),然后是其余的当前水果(按价格排序)。我们的用户收藏了苹果、梨和桃子,但 currentfruits 中只有苹果和梨,所以表格现在应该如下所示:
id | price | months left in season | color | rating
apples 1.25 6 red 8.4
pears 1.24 3 null null
blueberries 2.20 4 blue 8.8
oranges 1.75 5 orange 9.1
avocados 1.42 4 null null
我最初的想法是做这样的事情:
SELECT *
FROM userfavorites
JOIN currentfruits ON userfavorites.fruitid = currentfruits.id
JOIN fruitsinfo ON currentfruits.id = fruitsinfo.id
ORDER BY currentfruits.price DESC
UNION
SELECT *
FROM currentfruits
LEFT JOIN fruitsinfo ON currentfruits.id = fruitsinfo.id
ORDER BY currentfruits.price DESC
第一个SELECT
抓取所需表格的前两行,第二个SELECT
抓取用户在没有收藏夹时会看到的整个表格。不幸的是,这并没有像我希望的那样将这些行撞在一起。此外,因为 UNION 只处理不同的条目,我希望它能够处理可能出现在底部选择中的重复行,但是唉。
谁能告诉我如何进行查询以完成我想做的事情?谢谢。