SQL查询从表中的所有posible id中取出id并输出包含该id的行

时间:2017-03-23 13:44:10

标签: mysql sql

我想要一个选择具有UploadedbyUserID = Rand()的所有行的查询(在这种情况下选择可能UploadbyUserID的随机ID 4,3和22,只选择那些3不是2和5)

如果rand给出4则输出:

+------+------+------------+--------------------+
| id   | name |      date  | UploadedbyUserID   |
+------+------+------------+--------------------+
|    1 | 2222 | Testing    |                4   |
|    2 | Jack | description|                4   |
|    6 | Zara | 2007-02-06 |                4   |
+------+------+------------+--------------------+

这是整个表格

+------+------+------------+--------------------+
| id   | name |      date  | UploadedbyUserID   |
+------+------+------------+--------------------+
|    1 | 2222 | Testing    |                4   |
|    2 | Jack | description|                4   |
|    3 | ffdsd| 2007-05-06 |                4   |
|    4 | dsm  | 2007-05-27 |                3   |
|    5 | dddd | 2007-04-06 |                3   |
|    6 | Zara | 2007-02-06 |                4   |
|    7 | John | 2007-01-24 |                22  |
+------+------+------------+--------------------+

如果它随机化3则输出

+------+------+------------+--------------------+
| id   | name |      date  | UploadedbyUserID   |
+------+------+------------+--------------------+
|    4 | dsm  | 2007-05-27 |                3   |
|    5 | dddd | 2007-04-06 |                3   |
+------+------+------------+--------------------+

询问您是否需要更多信息

1 个答案:

答案 0 :(得分:1)

嗯。这是一种方式:

select t.*
from (select uploadedbyuserid
      from t
      order by rand()
      limit 1
     ) u join
     t
     using (uploadedbyuserid);

首先,我要说这是根据用户上传内容的次数加权的。所以,用户" 4"在你的例子中,它会比#34; 3"更频繁地出现。如果这是一个问题:

select t.*
from (select uploadedbyuserid
      from (select distinct uploadedbyuserid from t) t
      order by rand()
      limit 1
     ) u join
     t
     using (uploadedbyuserid);

下一个观察是,这可能是计算密集型的。如果你有很多行,有各种方法可以加快这些速度。例如,一个简单的方法是获得10000行中的1个:

select t.*
from (select uploadedbyuserid
      from (select distinct uploadedbyuserid
            from t
           ) t
      where rand() < 0.001
      order by rand()
      limit 1
     ) u join
     t
     using (uploadedbyuserid);