[MYSQL] OUTER JOIN moet lege velden teruggeven

Pagina: 1
Acties:

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Hoi, ik heb een probleem.

Een klant kan uit een grote lijst producten bepaalde producten op zijn site laten zien.

Ik heb twee tabellen:
Producten met de velden pid en titel.
Inhoud:
pidtitel
1A
2B
3C
4D

en
Import_products en pid en dealerid.
Inhoud:
piddealerid
220
320
38


Nu wil ik een resultaat als het volgende:
titeldealerid
ANULL
B20
C20
DNULL


Zoals je ziet worden alle producten getoond. Als het product terugkomt in import_products dan wordt het veld dealerid gevuld met het dealerid uit import_products.

Ik heb nu deze (foute) SQL:
SELECT pid, title, import_products.dealerid FROM catalog_product LEFT OUTER JOIN import_products ON pid = productid ORDER BY title ASC;

Die laat dit zien:
titeldealerid
ANULL
B20
C20
C8
DNULL


Maar als ik WHERE import_products.dealerid = '20' toevoeg, vallen producten A en D weer weg.

Hoe moet ik dit doen?

[ Voor 5% gewijzigd door looskuh op 16-04-2005 20:53 ]


Verwijderd

Een OR veldnaam = NULL eraan toevoegen ?

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Verwijderd schreef op zaterdag 16 april 2005 @ 21:10:
Een OR veldnaam = NULL eraan toevoegen ?
Dat zal niet werken, omdat het veld niet leeg is, maar de hele rij niet bestaat. (Als ik het goed begrijp O-) )

Hoi!


  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15:14

Tukk

De α-man met het ẞ-brein

Wat is de reden waar om de 20 wel getoond dient te worden en de 8 niet bij titel C?
Dat is het deel wat je mist in je SQL-statement om te krijgen wat je wil.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zaterdag 16 april 2005 @ 21:10:
Een OR veldnaam = NULL eraan toevoegen ?
Tommetje schreef op zaterdag 16 april 2005 @ 21:12:
Dat zal niet werken, omdat het veld niet leeg is, maar de hele rij niet bestaat. (Als ik het goed begrijp O-) )
Nee, dat zal niet werken omdat je niet kan vergelijken met = NULL, omdat de = operator niet geïmplementeerd is voor NULL-waarden. OR veldnaam IS NULL zou al een stuk beter zijn. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Tukk schreef op zaterdag 16 april 2005 @ 21:17:
Wat is de reden waar om de 20 wel getoond dient te worden en de 8 niet bij titel C?
Dat is het deel wat je mist in je SQL-statement om te krijgen wat je wil.
Om het duidelijk te houden heb ik een gedeelte van de informatie weggelaten. Zoals ik zei "WHERE dealerid = 20" werkt niet. Het moet dus iets anders zijn.

De dealerid kan dus veranderen. Het resultaat bij dealer 8 zou dus moeten zijn:

A - Null
B - Null
C - 8
D - Null

Vervolgens check ik met php of dealerid Null is of niet. Zo ja, dan moet een checkbox checked worden.

Voor de volledigheid is dit mijn hele code. Maar het voorbeeld in mijn eerste post zou voldoende moeten zijn.
code:
1
2
3
4
5
6
7
8
9
10
11
    $sql = "SELECT pid, title, import_products.dealerid FROM catalog_product LEFT OUTER JOIN import_products ON pid = productid WHERE catalog_product.subcatid = '".$tmp_subcatid."' AND catalog_product.dealerid='1' AND catalog_product.active = '1' ORDER BY title ASC;";
        
    $res = mysql_query($sql);
    if(mysql_num_rows($res) != 0){
        echo "Kies de producten die u op uw eigen site wilt laten zien:<BR><BR>\n";
        while($row = mysql_fetch_array($res)){
            echo "<INPUT TYPE='checkbox' NAME='arrProducts[]' VALUE='".$row["pid"]."'";
            if($row["dealerid"] == $_SESSION["ingelogdid"])
                echo " CHECKED";
            echo ">".$row["title"]."<BR>\n";
        }

[ Voor 26% gewijzigd door looskuh op 16-04-2005 22:22 ]


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

looskuh schreef op zaterdag 16 april 2005 @ 22:21:
[...]

Om het duidelijk te houden heb ik een gedeelte van de informatie weggelaten. Zoals ik zei "WHERE dealerid = 20" werkt niet. Het moet dus iets anders zijn.
Waarom reageer je niet op de post van NMe?

code:
1
WHERE (dealerid = 20 OR dealerid IS NULL)


Dat zou toch gewoon moeten werken?

Verwijderd

Uiteraard lijkt 't me dat je niet 't dealerid wilt vast leggen.. Dus de oplossing van (dealerid=20 or dealerid is Null) werkt dan niet.

De vraag is even of 't zo belangrijk is om het veld dealerid uit de database te lezen? Gebruik je dit? Je zou namelijk ook een truuk uit kunnen halen door je query als volgt te doen:
code:
1
2
3
4
SELECT DISTINCT pid, title, import_products.productid 
FROM catalog_product 
        LEFT OUTER JOIN import_products ON pid = productid 
ORDER BY title ASC;

Dit genereerd een lijst met een unieke set aan gegevens (de combinatie pid, title en productid komt maar 1 keer voor doordat als er gerelateerde records in import_products staan productid en pid eigenlijk gelijk zijn). Vervolgens check je of productid NULL is. En als dit niet werkt zou je misschien nog een IIF kunnen gebruiken (al weet ik niet uit m'n hoofd of mySQL dit ondersteund).

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
OR IS NULL werkt natuurlijk niet. Het veld dealerid is nooit Null, en het resultaat dealerid kan je met SQL niet uitlezen.
Verwijderd schreef op zaterdag 16 april 2005 @ 22:59:
De vraag is even of 't zo belangrijk is om het veld dealerid uit de database te lezen? Gebruik je dit?
Nee, die dealerid gebruik ik niet. Ik vul een lijst met checkboxes. Alle producten moeten worden getoond. En ik moet kunnen checken of de dealer het product heeft geselecteerd of niet.

if(veld = waarde) echo "CHECKED"

dus...

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Gelukt! De kunst was om ook de originele dealer-tabel erbij te joinen, en daarin de id van de dealer te checken.
code:
1
2
3
4
5
6
7
8
9
10
SELECT pid, title, import_products.dealerid
FROM catalog_product
LEFT OUTER JOIN import_products ON pid = productid
RIGHT OUTER JOIN dealers ON import_products.dealerid = dealers.dealerid
WHERE
catalog_product.subcatid = '".$subcatid."'
AND dealers.dealerid = '".$_dealerid."'
AND catalog_product.dealerid='1'
AND catalog_product.active = '1'
ORDER BY title ASC;";

tnx voor de hulp iig!

[ Voor 11% gewijzigd door looskuh op 17-04-2005 01:33 ]

Pagina: 1