有效地将两个选择查询组合为一个

时间:2019-02-24 13:47:49

标签: mysql

用户

id   |  name
1    |  A
2    |  B

文章

id   | title | descritption
1    | wx    | xyz
2    | yz    | abc

article_rating

article_id(article->id)  |  given_by(user->id)  |  given_rating
   1                              2                  4
   2                              1                  3

保存的文章

article_id(article->id)  |  saved_by(user->id) 
   1                              2            

我正在根据用户是否对文章进行评分/保存来更改一些按钮和图标。为此,我使用了两个选择查询:

已评分

SELECT given_rating as rating 
FROM article_rating 
WHERE  given_by=? AND article_id=?

是否保存

SELECT saved_by as saved 
FROM saved_article 
WHERE  saved_by=? AND article_id=?

所以我的问题是如何将两者有效地组合成一个mysql查询?

1 个答案:

答案 0 :(得分:2)

您好可以尝试基于两个表的并集编写单个查询,例如

SELECT val, source
FROM
(
    SELECT NULL AS saved_by, given_by, given_rating AS val, 'given_rating' AS source
    FROM article_rating
    UNION ALL
    SELECT NULL, NULL AS given_by, saved_by, 'saved_by'
    FROM saved_article
) t
WHERE
    (source = 'given_rating' AND given_by = ? AND article_id = ?) OR
    (source = 'saved_by' AND (saved_by = ? OR saved_by IS NULL) AND article_id = ?);

我在这里使用了一个常见的技巧,就是将计算列source引入联合查询中。然后,在WHERE子句中,我们可以引用它来决定我们需要应用哪些限制。

上面的查询是否有意义还取决于几件事,最重要的是given_ratingsaved_by属于单列报表。