How do I select random rows in MySQL?

后端 未结 9 1134
慢半拍i
慢半拍i 2020-12-08 23:09
mytable

pid name field
=== ==== =====
1    A1   0
2    A2   1
3    A3   1
4    A4   0   
5    A5   0

This is my table structure. Here I want to se

相关标签:
9条回答
  • 2020-12-08 23:28
    SELECT * FROM (
      SELECT DISTINCT name FROM mytable
      WHERE name <> 'A2' AND name <> 'A3'
      ORDER BY RAND()
      LIMIT 0,2
    UNION 
      SELECT DISTINCT name FROM mytable
      WHERE name = 'A2' OR name = 'A3'
      ORDER BY name
    )whateverQueryAlias
    ORDER BY RAND()
    

    That should do it.

    0 讨论(0)
  • 2020-12-08 23:30

    SELECT *, RAND() "xrand" FROM yourtable A ORDER BY xrand LIMIT 4

    0 讨论(0)
  • 2020-12-08 23:30
    SELECT * FROM `mytable` order by rand(), name asc limit 4.
    

    i think this will satisfy your need.

    0 讨论(0)
  • 2020-12-08 23:35

    turbod was close with his answer, he was just ordering randomly, when it seems you wanted to order by pid, after getting the random rows you wanted in conjunction with the ones concerning A2 and A3:

    (
        SELECT *
        FROM `mytable`
        WHERE 
            name ='A2' OR 
            name ='A3'
        LIMIT 2
    )
    UNION
    (
        SELECT DISTINCT *
        FROM `mytable`
        WHERE 
            name !='A2' OR 
            name !='A3'
        ORDER BY RAND( ) LIMIT 2
    ) 
    ORDER BY `pid`
    
    0 讨论(0)
  • 2020-12-08 23:40

    I ran a heavy test on this, passed.

    (
    SELECT * , 0.5 AS ordercol
    FROM `mytable`
    WHERE `name`IN ( "A2", "A3" )
    LIMIT 2
    )
    UNION (
    SELECT * , rand() AS ordercol
    FROM `mytable`
    WHERE `name` NOT IN ( "A2", "A3" )
    LIMIT 2
    )
    ORDER BY ordercol, `name` IN ( "A2", "A3" ) , `name` ="A3"
    

    This will do the job very well. But to make the result even more random, execute that statement with replacing that 0.5 value in 1st line with a random value chosen by your client application code like mt_rand(0, 1000000) / 1000000 in PHP . Make sure it falls between 0 and 1. But do NOT use mysql function rand() in place of that 0.5 because it will make A2 and A3 apart from each other. The trick is assigning a random value for "ordercol" in all rows but keep it same for A2 and A3

    EDIT: I believe we can replace the 0.5 value with a LEFT JOIN even instead of relying on discrete value by PHP, as we replace the first segment of the union, so the whole query becomes:

    (
    SELECT mt1.* , mt2.ordercol AS ordercol
    FROM `mytable` AS mt1
    LEFT JOIN (
    
    SELECT RAND( ) AS ordercol
    ) AS mt2 ON TRUE
    WHERE `name`
    IN (
    "A2", "A3"
    )
    LIMIT 2
    )
    UNION (
    SELECT * , rand() AS ordercol
    FROM `mytable`
    WHERE `name` NOT IN ( "A2", "A3" )
    LIMIT 2
    )
    ORDER BY ordercol, `name` IN ( "A2", "A3" ) , `name` ="A3"
    
    0 讨论(0)
  • 2020-12-08 23:43

    I doubt there is a sane way to this in MySQL only.

    I can think of one way of doing it, assuming you are using PHP/MySQL:

    Essentially you query everything but A3, then put A3 next to A2

    $res = mysql_query("SELECT name, field FROM mytable WHERE name <> 'A3' ORDER BY RAND()");
    $res2 = mysql_query("SELECT name, field FROM mytable WHERE name = 'A3'");
    
    $data = array();
    while($row = mysql_fetch_array($res))
          {
          array_push($data, $row);
    
          if ($row['name'] == "A2")
              {
              $row2 = mysql_fetch_array($res2);
              array_push($data, $row2);
              }
          }
    

    Now $data will contain your results in the desired order.

    0 讨论(0)
提交回复
热议问题