mySQL select 来自另一个 select 的列表

mySQL select from a list from another select

A 有一个 table 所以 :

id | name | idparent | info
 1 | AA   |          | x
 2 | BB   |          | 
 3 | CC   |          | x
 4 | DD   | 1        |
 5 | EE   | 1        |
 6 | FF   | 2        |
 7 | GG   | 2        |
 8 | HH   | 3        |
 8 | HH   | 4

我想做的就是这样 mySQL/PHP :

SELECT id FROM table WHERE info LIKE 'x'

并在 PHP

for i in each id result of the first request :
  SELECT id, name FROM table where idparent = i ORDER BY RAND() LIMIT 1;
endFor

例如,结果可能是:

4 |DD
8 |HH

并且由于 RAND(),结果也可能是:

5 |EE
8 |HH

但它不是那么漂亮,有没有可能在一次请求中做到这一点?

我试过几个想法都没有成功,这里就不一一列举了,以免影响我对主题的理解:)

提前感谢您的回答

这是一个使用 sub-queries 的解决方案,它仅对 MySQL 有效,因为 MySQL 的 GROUP BY 行为是 SQL 的扩展标准。

MySQL 解决方案使用 GROUP BY:

SELECT  t.id, t.name 
FROM (
    SELECT id, name, idparent
    FROM table 
    where idparent IN (SELECT id FROM table WHERE info LIKE 'x')
    ORDER BY RAND()
) t
GROUP BY t.idparent;

非MySQL的解决方案,通过group rankuser variable的分配:

SELECT * 
FROM (
    SELECT 
        id, name, idparent,
        IF(idparent = @last_idparent, @grp_rank := @grp_rank + 1, @grp_rank := 1) as grp_rank
    FROM table CROSS JOIN (SELECT @grp_rank := 1, @last_idparent := NULL) param
    where idparent IN (SELECT id FROM table WHERE info LIKE 'x')
    ORDER BY RAND()
) t
WHERE t.grp_rank = 1;

试试这个:

SELECT id, name FROM table natural join (SELECT id as idparent FROM table WHERE info LIKE 'x') as T ORDER BY RAND() LIMIT 1;

我希望这能解决问题。