MySQL为每组选择随机1图像1 SELECT语句

时间:2014-06-19 10:11:54

标签: mysql select random

我想在4个div中显示随机图像。

在div 1:1中,div_id为0的随机图像。 在div 2:1中随机图像,div_id为1。 在div 3:1随机图像与div_id 2。 在div 4:1中使用div_id 3的随机图像。

我的简化表:

id_img     id_div
  1          0
  2          0
  3          0
  4          1
  5          1
  6          2
  7          2
  8          3
  9          3
 10          3

例如,结果可以是:

id_img     id_div
  2          0
  4          1
  7          2
 10          3

以及下一次结果:

id_img     id_div
  3          0
  5          1
  6          2
  8          3

我认为只有一个SELECT是可能的,我尝试了几个像这样的查询:

SELECT id_div , id_img 
FROM img_table
WHERE id_div in ('0' ,'1' , '2' , '3')
GROUP BY id_div 
HAVING COUNT(*) = 2
ORDER BY RAND()

但不幸的是,我没有得到我想要的结果。我做错了什么?

3 个答案:

答案 0 :(得分:3)

另一种解决方案只使用一个group bysubstring_index() / group_concat()技巧:

SELECT id_div,
       substring_index(group_concat(id_img order by rand()), ',', 1) as id_img
FROM img_table
WHERE id_div in ('0', '1' , '2', '3')
GROUP BY id_div 
HAVING COUNT(*) = 2;

答案 1 :(得分:0)

你可以使用相关的子查询方法和rand()的顺序,以便每个div获得一个随机的图像

SELECT i.id_div ,
(SELECT id_img FROM img_table WHERE id_div=i.id_div ORDER BY RAND() LIMIT 1) AS id_img 
FROM img_table i
WHERE i.id_div in ('0' ,'1' , '2' , '3')
GROUP BY i.id_div 
HAVING COUNT(*) >= 2

Demo

答案 2 :(得分:0)

有趣的问题。

原始解决方案是一个相关的子查询,可以为id_div带回一个随机图像: -

SELECT id_div , 
    (SELECT id_img
        FROM img_table t
        WHERE t.id_div = main.id_div
        ORDER BY RAND()
        LIMIT 1) AS id_img
FROM img_table main
WHERE id_div in ('0' ,'1' , '2' , '3')
GROUP BY id_div 
HAVING COUNT(*) = 2

这可能不太快(RAND()的顺序不快,相关的子查询也不快)。

SQL fiddle here