现在,我正在使用一个循环来遍历我所拥有的100个ID。循环的每一次迭代都对DB执行一个查询。在我看来,这样做根本没有效率。我想把它放到一个查询中。但至少不能用我自己的方式说。
这是我一直在玩的查询。它应该让我对我想做的事情有一个很好的了解。
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
是否有一种方法可以使用一个函数或什么东西来限制连接返回的结果数为3?或者有其他的方法来获得我正在寻找的结果?
更新
我有不同的疑问。下面是另一个不返回任何内容的示例:
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;发布于 2018-07-18 19:15:35
基于您链接到的问题的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。
https://stackoverflow.com/questions/51407022
复制相似问题