Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[mysql] Ook null ophalen met join query

Pagina: 1
Acties:

  • Martine
  • Registratie: Mei 2002
  • Niet online
Voor de kledingverkoop van een website waar ik momenteel mee bezig ben, wil ik graag de verkochte maten van een bepaald kledingartikel van de afgelopen maand bekijken.

Er zijn drie tabellen beschikbaar;
kleding
- id (uniek)
- title

kleding_sizes
- id (uniek)
- size

kleding_order
- id (uniek)
- post_date (datum waarop besteld)
- naam
- adres

kleding_order_items (hierin zitten alle items die besteld zijn per kleding_order)
- orderid (match aan kleding_order.id)
- post_date (datum waarop besteld)
- kledingid (match aan kleding.id)
- sizeid (match aan kleding_sizes.id)
- number (aantal bestelde artikelen)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  kleding_sizes.size,
  COUNT(kleding_order_items.number) AS num
FROM
  kleding_orders
LEFT JOIN
  kleding_order_items ON kleding_orders.id = kleding_order_items.orderid
LEFT JOIN
  kleding_sizes ON kleding_order_items.sizeid = kleding_sizes.id
WHERE
  MONTH(kleding_orders.post_date) = 9 AND kleding_order_items.kledingid = 1
GROUP BY
  kleding_sizes.id
ORDER BY
  kleding_sizes.sort ASC



Met de bovenstaande query worden alle bestelde artikelen getoond, echter wil ik ook de maten van de NIET bestelde artikelen tonen. Ik ben er de hele morgen al mee aan het klooien en zie door de bomen het bos niet meer. 8)7

Want als ik zonder de MONTH() erbij de query uitvoer, dan krijg ik wel de niet verkochte kledingmaten erbij. De query zal op deze manier wel in orde zijn, alleen het is op diemanier niet mijn bedoeling.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De where clause filtert die rows. Dus doe dan where (kolom is null OR voorwaarde)

{signature}


  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 04:56

Reinier

\o/

Maak eens een outer join van de tweede left join, helpt dat?

  • remco_k
  • Registratie: April 2002
  • Laatst online: 16-11 12:27

remco_k

een cassettebandje was genoeg

Kijk eens naar een outer join van verschillende tabellen.

En daarbij een klein detail: kies 1 taal waarin je schrijft. Engels of Nederlands, maar niet door elkaar.

Alles kan stuk.


  • dvvelzen
  • Registratie: Februari 2002
  • Laatst online: 07-08 19:20
Martine schreef op donderdag 18 september 2008 @ 13:17: echter wil ik ook de maten van de NIET bestelde artikelen tonen. Ik ben er de hele morgen al mee aan het klooien en zie door de bomen het bos niet meer.
Volgens mij mis je ook iets hier voor.

je kan wel zien dat een combinatie van kleding + size is besteld omdat dat in een tabel staat. Echter er is geen tabel die aangeeft welke sizes je van een bepaald kleding item hebt. Al zou je elk kleding item in elke maat ten alle tijden hebben is het toch wel makkelijk om daar een N-N koppeltabel voor op te nemen.


Ik zou number vervangen in aantal of amount. en ik weet niet of mysql count ook gewoon een rowcount is maar is dat wel het geval dan moet je SUM doen ipv COUNT.

mvg,
Dennis

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Reinier schreef op donderdag 18 september 2008 @ 13:58:
Maak eens een outer join van de tweede left join, helpt dat?
Een LEFT JOIN is een outer join :)

  • dvvelzen
  • Registratie: Februari 2002
  • Laatst online: 07-08 19:20
code:
1
2
3
4
5
6
7
8
9
[*]SELECT kleding_sizes.size
[*],      SUM(ISNULL(kleding_order_items.number,0))
[*]FROM kleding_sizes
[*]LEFT JOIN kleding_order_items
[*]       ON kleding_sizes.id = kleding_order_items.sizeid
[*]WHERE MONTH(kleding_order_items.post_date) = 9
[*]AND   kleding_order_items.kledingid = 1
[*]GROUP BY kleding_sizes.size
[*]ORDER BY 1


probeer anders ff zoiets.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Martine schreef op donderdag 18 september 2008 @ 13:17:
code:
1
2
3
4
5
6
7
8
FROM
  kleding_orders
LEFT JOIN
  kleding_order_items ON kleding_orders.id = kleding_order_items.orderid
LEFT JOIN
  kleding_sizes ON kleding_order_items.sizeid = kleding_sizes.id
WHERE
  MONTH(kleding_orders.post_date) = 9 AND kleding_order_items.kledingid = 1
Verkeerde volgorde als je alle sizes wilt? Lijkt me dat die volgorde precies andersom moet zijn en dat je de where-clauses beter in de on kan stoppen ivm nulls. Ik bedoel dus:
SQL:
1
2
3
4
5
6
7
FROM
  kleding_sizes
LEFT JOIN
  kleding_order_items ON kleding_order_items.sizeid = kleding_sizes.id AND 
    kleding_order_items.kledingid = 1
LEFT JOIN
...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Wii4all
  • Registratie: November 2007
  • Niet online
Als je een plusje achter de join zet, dan lukt de join altijd ook bij een null waarde.

where K.kleding_size = u.kleding (+)

Burp


  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 04:56

Reinier

\o/

GlowMouse schreef op donderdag 18 september 2008 @ 14:17:
[...]

Een LEFT JOIN is een outer join :)
Ik bedoelde een FULL outer join, maar die is er niet in MySQL :)

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan nog is de oplossing of een IS NULL check, of in de ON clause opnemen (pedorus' suggestie) en loopt de rest van de mensen te blaten. ;)

{signature}


  • Martine
  • Registratie: Mei 2002
  • Niet online
dvvelzen schreef op donderdag 18 september 2008 @ 14:14:
[...]
je kan wel zien dat een combinatie van kleding + size is besteld omdat dat in een tabel staat. Echter er is geen tabel die aangeeft welke sizes je van een bepaald kleding item hebt. Al zou je elk kleding item in elke maat ten alle tijden hebben is het toch wel makkelijk om daar een N-N koppeltabel voor op te nemen.[...]
Die tabel heb ik er inmiddels ook bij gemaakt, denk dat ik het maar op ga lossen met een extra query in php want nee... dit wordt em niet :(

Heb het inmiddels zo opgelost, jaja wel enorm smerig.. :r
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
    kleding_size_koppel.sizeid,
    kleding_sizes.size
FROM
    kleding_size_koppel
LEFT JOIN
    kleding_sizes ON kleding_size_koppel.sizeid = kleding_sizes.id
WHERE
    kleding_size_koppel.kledingid = 1

-while loopje-

SELECT
    COUNT(kleding_order_items.number) AS num
FROM
    kleding_order_items
LEFT JOIN
    kleding_orders ON kleding_order_items.orderid = kleding_orders.id
WHERE
    MONTH(kleding_orders.post_date) = 9
    AND kleding_order_items.kledingid = 1
    AND  kleding_order_items.sizeid = [sizeid]
GROUP BY
    kleding_order_items.sizeid

[ Voor 34% gewijzigd door Martine op 18-09-2008 15:59 . Reden: de 'inmiddels opgelost' toegevoegd ]

Pagina: 1