テーブルがあるので:
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つのリクエストでこれを行う可能性はありますか?
私はいくつかのアイデアを試しましたが、成功しなかったので、私の主題の理解を汚さないために、ここでは列挙しません:)
よろしくお願いします
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 rank
をuser 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;
これを試して:
SELECT id, name FROM table natural join (SELECT id as idparent FROM table WHERE info LIKE 'x') as T ORDER BY Rand() LIMIT 1;
これで問題が解決することを願っています。