2014-09-15 2 views
1

Я столкнулся с проблемой немного в базе данных mysql. У меня есть две таблицы, такие как пользователь и почта.получить случайную запись конкретного объекта в базе данных mysql

стол пользователя enter image description here

сообщение таблица

enter image description here

MySQL Query

SELECT user_id,name FROM `post` where user_id IN(1,3,4); // 1,3,4 id of user from user table 

Над MySQL Query рабочего fine.But Теперь я хочу получил максимум три записи каждого пользователя случайным образом. Результат запроса выше

user_id name 
     1 one 
     3 two 
     1 three 
     1 four 
     1 five 
     4 somthing 
     4 test 
     1 some body 
     3 help 
     1 beauty 

Как я случайно получил три записи каждого пользователя, например user_id = 1, а затем случайным образом три записи этого пользователя из базы данных. Предположим, что у одного пользователя есть 1000 сообщений, а у другого пользователя также 500 сообщений. я хочу показать только максимум 3 сообщения каждого пользователя с помощью запроса mysql базы данных.

Заранее благодарен!

+0

Если вы хотите, рассмотрит следующую этой простой двухступенчатого курс действий: 1 Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, который соответствует информации, представленной на шаге 1. Нам не нужно видеть 1000 строк. 12, вероятно, сделают это. – Strawberry

+0

Попробуйте С этим .......SELECT user_id, name FROM post WHERE user_id IN (ваши значения) ORDER BY RAND() LIMIT 0,3 –

+0

@Zaibi вы ограничиваете строки, которые мне не нужны. Предположим, user_id IN (1,3,4) // выбираем случайным образом максимум три столбца каждого пользователя, а не три строки столбцовой таблицы , поэтому максимальные строки 3 * 3 = 9 // как три пользователя, такие как 1,3 и 4. – Haseeb

ответ

0

вы можете попробовать это я так думаю, что будет работать

ВЫБЕРИТЕ user_id, имя ОТ post где user_id IN (1,3,4) упорядочить по user_id рандов() ограничить 0,2

+0

ваше решение не работает :( – Haseeb

0

ORDER BY RAND() в сочетании с LIMIT полезно для выбора случайной выборки из набора строк

Вот решение я рекомендую, вы должны использовать UNION в запросе или вы можете использовать LOOP изменить user_id значение для следующего поворота.

я есть проверить его с UNION

SELECT user_id, name FROM post WHERE user_id = 1 ORDER BY RAND() LIMIT 3 
UNION 
SELECT user_id, name FROM post WHERE user_id = 3 ORDER BY RAND() LIMIT 3 
UNION 
SELECT user_id, name FROM post WHERE user_id = 4 ORDER BY RAND() LIMIT 3 

на этот раз у нас есть только три значения для условия, но если вы должны сделать это для более значений User_ID вы должны использовать LOOP для изменения значения условия.

+0

, если есть 1000 пользователей, тогда мы собираемся объединить 1000 запросов? – Bilal

+0

i alredy said, для более условных значений (пользователей) мы должны использовать LOOP, чтобы изменить его, и, наконец, мы получим желаемый результат. –

+0

Если тысяча пользователей существует, тогда тысяча циклов пробега времени занимает время – Haseeb

0

Используйте этот запрос, надеясь, что вы достигнете своих требований.

SELECT 
     product.product_id, 
     tb.order_product_id, 
     tb.rank, 
     product.date_added 
    FROM product 
     LEFT JOIN (SELECT 
        product_id, 
        order_product_id, 
        (SELECT 
         COUNT(*) 
        FROM order_product AS aopin2 
        WHERE aopin.product_id = aopin2.product_id AND aopin2.order_product_id < aopin.order_product_id) AS rank 
       FROM order_product AS aopin) tb 
     ON product.product_id = tb.product_id AND tb.rank < 3 
    ORDER BY product.product_id,date_added DESC 
0

Корреляционные подзапросы могут пригодиться. Ниже запрос будет возвращать 3 записи для каждого из пользователей в post таблицы

SELECT `post`.id, `post`.user_id, `post`.name 
FROM `post` 
WHERE 3 > (
    SELECT count(*) 
    FROM `post` AS `post1` 
    WHERE `post`.`user_id` = `post1`.`user_id` 
    AND `post`.`id` > `post1`.`id` 
) 
ORDER BY `post`.`id` DESC 

Чтобы получить их случайные записи,

SELECT `post`.id, `post`.user_id, `post`.name 
FROM `post` 
WHERE 3 > (
    SELECT count(*) 
    FROM `post` AS `post1` 
    WHERE `post`.`user_id` = `post1`.`user_id` 
    AND `post`.`id` > `post1`.`id` 
) 
ORDER BY RAND() 
Смежные вопросы