mysql & JOIN

pangu

Angesehenes Mitglied
habe folgendes rekursives abfrageschema:
QUOTE
include('var.inc.php');

$abfrage = "SELECT a, b FROM tabelle1 WHERE punkte>0 AND aktiv='1'";
$ergebnis = mysql_query($abfrage);
if($ergebnis){
while($daten = mysql_fetch_object($ergebnis))
{
$a = $daten->a;
$b = $daten->b;


$abfrage2 = "SELECT c FROM tabelle2 WHERE x='$x'";
$ergebnis2 = mysql_query($abfrage2);
if($ergebnis2){
while($daten2 = mysql_fetch_object($ergebnis2))
{$punkte = $daten2->punkte;}}
if ($punkte > 0)
{
$a[]=$a; //daten aus tabelle1
$b[]=$b;
$anzahl++;
}

if ($anzahl>3) //es wurden genügend treffer gefunden
{break;} //abfrage beenden
}//end while
}//end if

mysql_close($verbindung);


(zusammengefasst:
ich möchte aus der tabelle a daten auslesen aber nur wenn in der tabelle b (userdaten) genügend punkte vorhanden sind.)

->hab mir sagen lassen, das das mit >JOIN< viel effizienter gehen soll,
nur kapier ich nicht ganz we das geht. kann mir jmd. helfen? thx
 
habe es jetzt so gelöst:

CODE
$abfrage = "SELECT a.* FROM tabelle1 AS a, tabelle2 AS b WHERE punkte>0 AND aktiv='1' LIMIT 5";
$ergebnis = mysql_query($abfrage);
if($ergebnis){
while($daten = mysql_fetch_object($ergebnis))
{
$id[] = $daten->id;

$anzahl++;
}}



echo $anzahl;
allerdings wird die schleife doppel durchlaufen (wenn ich in der datenbank z.b. 2 treffer habe, werden dies doppelt, also 4x ausgegeben.)
->was ist da falsch?
blink.gif
 
CODE
SELECT a.* FROM tabelle1 AS a
INNER JOIN tabelle2 AS b
ON punkte>0 AND aktiv='1';



Vielleicht funktionierts ja so?

Mit diesem Statement werden alle Einträge von tabelle1 mit tabelle2 verknüpft, falls
CODE punkte>0 AND aktiv='1'
 
danke für den Vorschlag, aber damit bekomme ich genau das selbe Ergebnis.
habe jetzt mal das $anzahl++; durch $anzahl=$anzahl+.5; ersetzt und somit geht es.

nur finde ich die Lösung irgendwie "unsauber":
..oder gehört das so?
das immer wenn man zwei Tabellen gleichzeitig vergleicht, die Whileschilfe auch jeweils doppelt durchlaufen wird?
 
x = $x ? was soll denn das bitte heissen?

du brauchst um eine tabelle abzufragen zwischen tabelle2 und tabelle1 eine beziehung.
zum beispiel eine id wie:

es gibt eine tabelle adresse dort stehen alle adressen drinne (Tabelle1)
in einer mitarbeiter tabelle stehen die adressen der mitarbeiter (tabelel2)

die beziehung zwischwen tabelle1 und tabelle2 ist also die adresseid aus der adresse tabelle.

es musst nicht unbedingt so eine beziehung sein aber der inhalt unter dem php-resource link sollte einigermaßen klar sein bevor man mit joins spielt
wink.gif


damit wir für dich mit joins spielen können sollte uns klar sein was genau du machen willst. daher würde ich empfehlen nicht irgendein fiktives beispiel zu erfinden sondern wenn auch gekürzt die reale situation abbilen. dann können wir besser verstehen was du willst und dir besser helfen
smile.gif

 
QUOTE (manuel @ Fr 5.8.2005, 11:41) damit wir für dich mit joins spielen können sollte uns klar sein was genau du machen willst. daher würde ich empfehlen nicht irgendein fiktives beispiel zu erfinden sondern wenn auch gekürzt die reale situation abbilen. dann können wir besser verstehen was du willst und dir besser helfen
smile.gif


also situation ist folgende:
ich möchte eine art bannertausch realisieren. es sollen gleichzeitig mehrere links aus der tabelle 'webseiten' per zufall ausgewählt werden. es dürfen aber nur banner eingeblendet werden, wenn der user den der banner gehört noch genügend guthaben hat (guthaben ist in der tabelle 'user gespeichert').
 
dann wäre die abfrage irgendwie so:

CODE
SELECT
banner.url,
banner.bildurl,
banner.beschreibung
FROM user
LEFT JOIN banner ON user.userid = banner.userid
WHERE user.guthaben > 0
ORDER BY RAND()
LIMIT 3




so
wink.gif
... diese Abfrage liefert dir 3 Banner von 3 Usern deren guthaben größer als null ist.
diese user sind zufällig. wobei der rand() (zufällige sortierung) Generator meiner Meinung nach nicht soo super funktioniert.

Jetzt könntest du einfach die 3 Banner ausgeben und fertig.
 
yep, so funktioniert's perfekt. ganz vielen dank!!
laugh.gif


ach ja: damit ich dabei auch was lerne: was bedeutet das >LEFT< bei left-join genau?
 
die oben angegebene php-resource quelle sollte das aussreichend erläutern.

so ich wie ich das verstanden habe gibt es:

inner join
left outer join | right outer join

wobei das outer weg gelassen werden kann ;-)

ein inner join verbindet tabellen dort wo die ON bedingung passt. also er würde dir nur alle user geben die auch wirklich einen banner haben. aber keine user die keinen haben.

um alle user zu bekommen und für die user die banner die welche haben benutzt man einen left oder right join. diese left oder right joins nehmen ALLE zeilen von der rechten oder linken tabelle und verknüpfen mit der jeweils anderen tabelle fals vorhanden.

folglich wäre hier auch ein inner join völlig ausreichend. der left join wurde nur aus gewohnheit gewählt
wink.gif
 
Zurück
Oben