Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL: Limited Join? (https://www.delphipraxis.net/178000-mysql-limited-join.html)

Angel4585 10. Dez 2013 12:08

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:
SELECT * 
FROM A, B
ORDER BY A,rand()
Und da hörts schon auf.
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 :(

DeddyH 10. Dez 2013 12:17

AW: MySQL: Limited Join?
 
Hilft Dir dieser Artikel weiter (nur überflogen)?

baumina 10. Dez 2013 12:21

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

Angel4585 10. Dez 2013 12:38

AW: MySQL: Limited Join?
 
Danke @ DeddyH, leider hat mir das jetzt nicht geholfen :(

@baumina
Zitat:

Zitat von baumina (Beitrag 1239272)
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

Geht leider nicht, da dann die Fehlermeldung kommt "Subquery returns more than 1 row"

Auch das geht nicht:

Code:
Select A.id,B.id
From A
Inner Join (Select id From B ORDER BY RAND() LIMIT 5) B
Das kommt dem ganzen zwar am nächsten, aber dann haben alle A's die gleichen B's
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.

rapante 10. Dez 2013 12:51

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

baumina 10. Dez 2013 12:53

AW: MySQL: Limited Join?
 
Wie siehts so aus?

Code:
SELECT *
FROM A, B
ORDER BY RAND(B.ID)
LIMIT 5
EDIT: Ne is glaub auch nix.

DeddyH 10. Dez 2013 12:57

AW: MySQL: Limited Join?
 
http://stackoverflow.com/questions/2...ults-per-group

Angel4585 10. Dez 2013 13:05

AW: MySQL: Limited Join?
 
Danke rapante, das wäre eine durchaus akzeptable Lösung :thumb:
Code:
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
Einziges gravierendes Problem:
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: http://stackoverflow.com/questions/2...select-not-wor
Und hab mittlerweile auch eine Lösung:
Code:
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
Etwas anderes Ergebnis, aber damit kann ich arbeiten :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz