Выберите только максимум 3 строки от одного и того же пользователя - MySQL - PullRequest
1 голос
/ 02 октября 2009

Допустим, есть две таблицы:

Таблица "фото" с колонками:

id,
title,
path,
user_id

и таблица "пользователи" с колонками:

id
username

Что я хочу сделать, это выбрать, скажем, 30 фотографий из таблицы «фото», но при условии, что в выбранном наборе результатов будет не более 3 фотографий от одного пользователя. Пока у меня есть этот запрос:

SELECT p.*, u.username FROM photos AS p 
INNER JOIN users AS u ON u.id = p.user_id 
ORDER BY p.id DESC LIMIT 30;

Как создать предложение WHERE для достижения макс. 3 строки от одного и того же пользователя в наборе результатов выборки?

РЕДАКТИРОВАТЬ: я использую MySQL 5.1.33

Ответы [ 4 ]

4 голосов
/ 02 октября 2009
SELECT p.*, u.username 
FROM photos AS p 
INNER JOIN users AS u ON u.id = p.user_id 
WHERE p.id in (
 SELECT id  
 FROM photos p
 WHERE user_id  = p.user_id 
 LIMIT 3
)
ORDER BY p.id DESC LIMIT 30;
3 голосов
/ 02 октября 2009

Хорошо, вот «умный» способ сделать это:

SELECT u.username, p1.* FROM photos AS p1
 INNER JOIN users AS u ON u.id=p1.user_id
 LEFT OUTER JOIN photos AS p2 ON p2.user_id=p1.user_id and p2.id <= p1.id
 GROUP BY p1.id
 HAVING COUNT(p2.id) <= 3
 LIMIT 30;

Сказав это, будьте утомлены "умным" кодом. В ближайшем будущем вы чувствуете себя хорошо, но обслуживание может быть болезненным.

2 голосов
/ 02 октября 2009

Я бы посмотрел на эту технику . Ваш пункт где будет ГДЕ row_number <3 </p>

и затем предел 30

1 голос
/ 02 октября 2009

Рука переведена с T-SQL, поэтому не тестировалась на MySQL.

SELECT p.*, u.username
FROM photos AS p
INNER JOIN users AS u ON u.id = p.user_id
WHERE p.id IN (
 SELECT p1.id
 FROM photos p1
 JOIN photos p2
 ON p1.user_id = IFNULL( p2.user_id, p1.user_id )
 AND p1.id <= IFNULL( p2.id, p1.id )
 GROUP BY p1.id
 HAVING COUNT(*) < 4
)
LIMIT 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...