这是我用表名照片获得的表格:
photo_id user_id
401 1
403 1
405 1
407 2
408 1
409 2
410 1
411 3
412 2
413 2
420 2
423 2
我目前正在使用查询
SELECT *
FROM photos
WHERE user_id
IN ( 1, 2 )
LIMIT 0 , 6
IN
内的ID可以有多个值而不仅仅是两个
我得到的是
photo_id user_id
401 1
403 1
405 1
407 2
408 1
409 2
没有每个user_id的比例值
我想要的是从两个UserIds获得相等比例的值。也就是说,如果获取限制为6,则如果从1和3值中存在少于3个元素,则需要3个值或小于3;如果从2开始存在少于3个元素,则需要少于3个
如果有3个用户ID,则获取限制为6;所有三个ID都会产生值为2
的结果photo_id user_id
401 1
403 1
405 1
407 2
409 2
412 2
我可以在多个查询中执行此操作;但有没有办法在单个查询中执行此操作;
答案 0 :(得分:1)
考虑以下内容......
DROP TABLE IF EXISTS photos;
CREATE TABLE photos
(photo_id INT NOT NULL PRIMARY KEY
,user_id INT NOT NULL
);
INSERT INTO photos VALUES
(401 ,1),
(403 ,1),
(405 ,1),
(407 ,2),
(408 ,1),
(409 ,2),
(410 ,1),
(411 ,3),
(412 ,2),
(413 ,2),
(420 ,2),
(423 ,2);
SELECT x.*
, COUNT(*) rank
FROM photos x
JOIN photos y
ON y.user_id = x.user_id
AND y.photo_id <= x.photo_id
GROUP
BY x.photo_id
, x.user_id
ORDER
BY user_id
, rank;
+----------+---------+------+
| photo_id | user_id | rank |
+----------+---------+------+
| 401 | 1 | 1 |
| 403 | 1 | 2 |
| 405 | 1 | 3 |
| 408 | 1 | 4 |
| 410 | 1 | 5 |
| 407 | 2 | 1 |
| 409 | 2 | 2 |
| 412 | 2 | 3 |
| 413 | 2 | 4 |
| 420 | 2 | 5 |
| 423 | 2 | 6 |
| 411 | 3 | 1 |
+----------+---------+------+