2016-04-02 8 views
3

A aus einer Liste auswählen eine Tabelle so:mySQL von einem anderen wählen

 
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 

und was ich will, wie dies mit mySQL/PHP zu tun ist getan:

 
SELECT id FROM table WHERE info LIKE 'x' 

und in 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 

zum Beispiel könnte das Ergebnis sein:

 
4 |DD 
8 |HH 

und wegen des RANDES(), könnte das Ergebnis sein:

 
5 |EE 
8 |HH 

aber es ist nicht so schön, ist es eine Möglichkeit, dies in nur eine Anfrage zu tun?

Ich habe mehrere Idee versucht, aber ohne Erfolg, ich aufzählen nicht hier, um das Verständnis mein Thema nicht zu verschmutzen :)

den Dank im Voraus für Ihre Antwort

+0

Überprüfen Sie die aktualisierte Antwort. – geeksal

Antwort

2

Hier ist eine Lösung mit sub-queries, die nur für MySQL gültig ist, da das GROUP BY Verhalten von MySQL eine Erweiterung für SQL-Standard ist.

MySQL Lösung mit 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; 

Lösung für Nicht-MySQL, durch Zuweisung von group rank mit 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; 
+0

Es funktioniert, und ich war überrascht, aber jetzt verstehe ich, warum: http://StackOverflow.com/Questions/1225144/Why-does-mysql-allow-group-by-queries-without-aggregate-Funktionen Danke! – Naeco

+0

Juste für Neugier, haben Sie eine Lösung für eine andere SQL-Datenbank, weil das Verhalten von "Gruppe von" nur für mySQL existiert. – Naeco

+0

ist es einfach. Ich bin am Handy. Eine Möglichkeit besteht darin, 1 .... N für jede Gruppe in der inneren Unterabfrage zuzuweisen und 1 in der äußeren Abfrage herauszufiltern. –

1

Try this:

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

Ich hoffe, das wird res olve das Problem.

+0

dieser Vorschlag nur eine Zeile zurück, es war einer meiner Versuche:/ – Naeco

+0

@ user3671363 tatsächlich ist es sehr schwierig, ohne Beispieldaten zu testen. Kannst du bitte einen sqlfiddle posten? Während ich versuche, etwas anderes herauszufinden. – geeksal

+0

@ user3671363 überprüfen Sie einfach meine aktualisierte Lösung und lassen Sie mich wissen, ob es funktioniert. Nur um zu wissen, ob ich richtig bin ... Ich weiß, dass du die Antwort bereits akzeptiert hast. – geeksal