0

For the example here we will use the table NAMES and I need 3 rows returned.

id name
1 Alpha
2 Beta
3 Chi
4 Delta
5 Epsilon

I know the code SELECT * FROM names ORDER BY RAND() LIMIT 3; will return 3 randomized rows. But it is exclusively three different rows.

Is there a way to in a query get three rows that do not influence each other, and thus allow for repetion? So a result could be Beta, Alpha, Delta. Or Beta, Epsilon, Beta, or even Beta, Beta, Beta.

1 Answers1

0

Try achieving this via independent subqueries that are stitched together using union all

SELECT * FROM (SELECT id, name FROM names ORDER BY RAND() LIMIT 1) d
UNION ALL
SELECT * FROM (SELECT id, name FROM names ORDER BY RAND() LIMIT 1) d
UNION ALL
SELECT * FROM (SELECT id, name FROM names ORDER BY RAND() LIMIT 1) d

Note: I recommend you don't rely solely on "select *", specify the columns you need.

Try running it here (using Postgres) more than once: https://dbfiddle.uk/IwNV0z34

Another method would be to multiply the number of rows by the wanted sample size (here it is 3) using a cross join then selecting from that:

select
    id, name, cj.n
from names
cross join (select 1 n union all select 2 union all select 3) cj
order by rand()
limit 3

see both methods working here: https://dbfiddle.uk/bhBLmOSv

nb: random() is used in the fiddles as the alternative to rand()

Paul Maxwell
  • 33,002
  • 3
  • 32
  • 51