AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL: Limited Join?

Ein Thema von Angel4585 · begonnen am 10. Dez 2013 · letzter Beitrag vom 10. Dez 2013
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

MySQL: Limited Join?

  Alt 10. Dez 2013, 12:08
Datenbank: MySQL • Version: 5 • Zugriff über: PHP
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
Martin Weber
Ich bin ein Rüsselmops

Geändert von Angel4585 (10. Dez 2013 um 12:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:17
Hilft Dir dieser Artikel weiter (nur überflogen)?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:21
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
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:38
Danke @ DeddyH, leider hat mir das jetzt nicht geholfen

@baumina
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.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
171 Beiträge
 
Delphi XE2 Professional
 
#5

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:51
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
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:53
Wie siehts so aus?

Code:
SELECT *
FROM A, B
ORDER BY RAND(B.ID)
LIMIT 5
EDIT: Ne is glaub auch nix.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 12:57
http://stackoverflow.com/questions/2...ults-per-group
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#8

AW: MySQL: Limited Join?

  Alt 10. Dez 2013, 13:05
Danke rapante, das wäre eine durchaus akzeptable Lösung
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
Martin Weber
Ich bin ein Rüsselmops

Geändert von Angel4585 (10. Dez 2013 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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