MySQL三表连接用户收藏系统

时间:2013-04-28 10:44:58

标签: mysql sql select join favorites

我正在尝试创建一个用户收藏夹系统,但很难创建一个完成我需要的查询。我将以水果为例。

首先,这是我的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中的所有条目都在fruitsinfo中,并且userfavorites中的所有条目都不在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表格中,然后先列出这些结果(按价格排序),然后查看其他当前水果(按价格排序)。我们的用户有苹果,梨和桃子作为最爱,但只有苹果和梨在当前的果实,所以表现在应该是:

   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只处理不同的条目,我希望能够处理可能会显示底部选择的重复行,但是唉。

有谁能告诉我如何进行查询以完成我想要做的事情?感谢。

1 个答案:

答案 0 :(得分:3)

您不必使用UNION。尝试:

select c.id, c.price, c.`months left in season`, i.color, i.rating 
from currentfruit c
left join fruitsinfo i on c.id = i.id
left join userfavorites f on c.id = f.id and f.userid = 5
order by case when f.id is not null then 0 else 1 end, c.price desc