我如何获得MySQL中的联接结果

时间:2018-07-18 16:35:41

标签: mysql sql join

现在,我正在使用循环来遍历我拥有的100个ID。循环的每次迭代都会查询数据库。我认为这根本没有效率。我想将其放入一个查询中。但这并不是我所说的话。

这是我一直在处理的查询。它应该可以很好地说明我要做什么。

SELECT
    festival_backers.clown_id,
    festival_backers.user_id
FROM festival_backers
INNER JOIN users ON users.id = festival_backers.user_id
LEFT JOIN festival_backers AS lesser ON lesser.festival_id = 1632 AND lesser.clown_id = festival_backers.clown_id
WHERE festival_backers.festival_id = 1632
  AND lesser.clown_id IN (136541, 1000376982, 222329...)
  AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
GROUP BY festival_backers.clown_id
HAVING COUNT(lesser.clown_id) < 3
ORDER BY (festival_backers.amount + (festival_backers.free_vote / 10)) DESC
LIMIT 300;

此查询没有任何帮助。

我正在寻找的结果。

clown_id    | user_id
-----------------------------
136541      | 21324
136541      | 57889
136541      | 89632
1000376982  | 56432
1000376982  | 57343
1000376982  | 23345
222329      | 45456
222329      | 77854
222329      | 67789

我正在努力争取支持小丑的用户。但只有三个不超过此数目。我可以查询三个以上的位置,但这不好(它们太多了)。

我之所以使用NOT IN(以下示例)是因为user_id也被用作小丑,因为它们也是用户。

AND lesser.user_id NOT IN [...]

我尝试了以下操作:https://stackoverflow.com/a/30269273/736910

是否有一种方法可以使用函数或某种方法来限制通过联接返回三个结果的数量?还是有其他方法可以得到我想要的结果?

更新

我有不同的查询...这是另一个也不返回任何示例:

SELECT
        festival_backers.clown_id,
        festival_backers.user_id
    FROM festival_backers
    INNER JOIN users ON users.id = festival_backers.user_id
    INNER JOIN festival_backers AS lesser ON lesser.festival_id = 1632 AND lesser.clown_id = festival_backers.clown_id
    WHERE festival_backers.festival_id = 1632
      AND lesser.clown_id IN (136541, 1000376982, 222329...)
      AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
    GROUP BY festival_backers.clown_id
    HAVING COUNT(festival_backers.clown_id) < 3
    ORDER BY (festival_backers.amount + (festival_backers.free_vote / 10)) DESC
    LIMIT 300;

1 个答案:

答案 0 :(得分:0)

基于您链接到的问题中的this answer

SELECT b.clown_id, b.user_id   
FROM festival_backers AS b
LEFT JOIN festival_backers AS lesser 
    ON b.clown_id = lesser.clown_id 
    AND b.user_id < lesser.user_id
    AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
WHERE b.festival_id = 1632
AND b.clown_id IN (136541, 1000376982, 222329...)
AND b.user_id NOT IN (136541, 1000376982, 222329...)
GROUP BY b.clown_id, b.user_id
HAVING COUNT(lesser.user_id) <= 5

请注意,您要比较的lesser表上的条件必须放在ON子句中,而不是WHERE子句中。

这将为每个小丑ID返回5个最低的用户ID。如果要通过用户ID以外的其他属性对它们进行排序,请将b.user_id < lesser.user_id更改为b.otherColumn < lesser.otherColumn