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 rank
与user 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;
我希望这能解决问题。
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 rank
与user 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;
我希望这能解决问题。