web-dev-qa-db-ja.com

mySQL別の選択からのリストから選択

テーブルがあるので:

 id |名前| 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 

しかし、それはそれほど美しくはありません、たった1つのリクエストでこれを行う可能性はありますか?

私はいくつかのアイデアを試しましたが、成功しなかったので、私の主題の理解を汚さないために、ここでは列挙しません:)

よろしくお願いします

5
Naeco

MySQLのsub-queries動作はSQL標準の拡張であるため、これはMySQLにのみ有効なGROUP BYを使用したソリューションです。

GROUP BYを使用したMySQLソリューション:

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;

group rankuser variableに割り当てることによる、MySQL以外のソリューション:

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;
6
Dylan Su

これを試して:

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

これで問題が解決することを願っています。

1
geeksal