![]() |
Datenbank: MySQL • Version: 5 • Zugriff über: PHP
MySQL: Limited Join?
Hallo!
Ich suche mal wieder ein SQL-Statement. Ich habe Tabelle A und Tabelle B. Beide haben x bzw y Einträge. A hat bspw. 1,2,3,4,5,6,7,8,9,10,11,12,13 B hat bspw. 1,2,3,4,5,6,7 Jetzt brauch ich als Ergebnis im Prinzip ein Inner Join mit allen Einträgen aus A und allen Einträgen aus B, aber ich möchte nicht alle aus A mit allen aus B, sondern ein Eintrag aus A soll immer nur mit 5 Einträgen aus B im Resultat auftauchen. Die Verteilung der B-Einträge soll zufällig sein, also nicht immer die ersten 5. Soweit bin ich bisher:
Code:
Und da hörts schon auf.
SELECT *
FROM A, B ORDER BY A,rand() Wenn ich jetzt ein Limit 5 mache, bekomme ich insgesamt nur 5. Bei einem Group by A bekomm ich immer nur ein A. Und sonst hab ich grad keinen Schimmer wie ich das anstellen könnte um auf das gewünschte Ergebnis zu kommen. Hat jemand eine Idee wie das gehen könnte? Sonst muss ich wohl doch mehrere Einzelabfragen machen und im Code aussortieren :( |
AW: MySQL: Limited Join?
Hilft Dir
![]() |
AW: MySQL: Limited Join?
Ich denke so in diese Richtung müsste das klappen, nicht komplett durchdacht, aber sicher ein guter Ansatz:
Code:
Select *, (Select ID From B where A.ID=B.ID ORDER BY RAND() LIMIT 5) BID
From A |
AW: MySQL: Limited Join?
Danke @ DeddyH, leider hat mir das jetzt nicht geholfen :(
@baumina Zitat:
Auch das geht nicht:
Code:
Das kommt dem ganzen zwar am nächsten, aber dann haben alle A's die gleichen B's
Select A.id,B.id
From A Inner Join (Select id From B ORDER BY RAND() LIMIT 5) B Wenn es B's gibt wie oben beschrieben, soll z.B. A1:B10,B2,B7,B9,B5 und A2:B1,B7,B3,B6,B9 haben. |
AW: MySQL: Limited Join?
Ich weiss nicht ob ich deine Anforderung richtig verstanden habe. Wie ist es denn hiermit?:
Code:
SELECT tableA.x,
(SELECT tableB.y FROM tableB ORDER BY rand() LIMIT 1) AS erg1, (SELECT tableB.y FROM tableB ORDER BY rand() LIMIT 1) AS erg2, (SELECT tableB.y FROM tableB ORDER BY rand() LIMIT 1) AS erg3, (SELECT tableB.y FROM tableB ORDER BY rand() LIMIT 1) AS erg4, (SELECT tableB.y FROM tableB ORDER BY rand() LIMIT 1) AS erg5 FROM tableA |
AW: MySQL: Limited Join?
Wie siehts so aus?
Code:
EDIT: Ne is glaub auch nix.
SELECT *
FROM A, B ORDER BY RAND(B.ID) LIMIT 5 |
AW: MySQL: Limited Join?
|
AW: MySQL: Limited Join?
Danke rapante, das wäre eine durchaus akzeptable Lösung :thumb:
Code:
Einziges gravierendes Problem:
select A.id,
(select id from B order by rand() limit 1)b1, (select id from B where not id in(b1) order by rand() limit 1)b2, (select id from B where not id in(b1,b2) order by rand() limit 1)b3, (select id from B where not id in(b1,b2,b3) order by rand() limit 1)b4, (select id from B where not id in(b1,b2,b3,b4) order by rand() limit 1)b5, from A Trotz der Where treten doppelte Werte auf, als b1 und b2 im gleichen Datensatz haben z.B. den Wert 5, was aber nicht sein soll. edit: baumina, leider nicht :) edit2: hab hier mal das Problem geschildert: ![]() Und hab mittlerweile auch eine Lösung:
Code:
Etwas anderes Ergebnis, aber damit kann ich arbeiten :)
select id, b1, b2, b3, b4, b5
from ( select A.id, @ := (select GROUP_CONCAT(DISTINCT id ORDER BY RAND()) AS ids from B), SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 1), ',', -1) b1, SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 2), ',', -1) b2, SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 3), ',', -1) b3, SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 4), ',', -1) b4, SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 5), ',', -1) b5 from A ) t |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz