[Mysql] Count met Outer join

Pagina: 1
Acties:
  • 36 views sinds 30-01-2008

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
lukt niet :'(. En ik wordt er een beetje wanhopig van eerlijk gezegd.

Ik moet van meerdere tabellen data eruit trekken met een Outer join dus, want de count moet ook alle nul-waardes netjes teruggeven .

Dit heb ik gebakken :

code:
1
2
3
4
5
6
SELECT COUNT(TBL_RESPONSE.ANSWER_ID) AS CNT_ANSW,TBL_ANSWER_LANG.
ANSWER_ID, ANSWER_ANSWERTEXT
FROM TBL_ANSWER_LANG
LEFT OUTER JOIN TBL_RESPONSE ON 
TBL_RESPONSE.ANSWER_ID = TBL_ANSWER_LANG.ANSWER_ID
GROUP BY TBL_ANSWER_LANG.ANSWER_ID


En dit gaat dus goed in principe. De id's EN de nulwaardes (waar nodig) komen netjes terug.

Maar nu wil ik een WHERE clause toevoegen om wat selecties te maken op de database en dan gooit ie weer gewoon alle nulwaardes uit de tabel :?

Weet iemand waarom o' waarom :?

[ Voor 0% gewijzigd door Basszje op 20-09-2002 10:46 . Reden: Trekken ]

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Data aftrekken met een OUTER JOIN??? Hoe bedoel je dat?

Wat voor WHERE cluase wil je toevoegen?

Never underestimate the power of


  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
cameodski schreef op 20 september 2002 @ 10:39:
Data aftrekken met een OUTER JOIN??? Hoe bedoel je dat?
Oh sorry, minder gelukkig typefoutje >:)
Wat voor WHERE cluase wil je toevoegen?
WHERE ID = 10 AND LANG_ID = 20 . Zoiets. Nix boeiend oid .

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Doe anders eens COUNT (*). Misschien is dat wat je zoekt.

Ik begrijp helaas nog niet helemaal wat je nou precies terug wilt hebben, dus misschien zoek je dit wel helemaal niet, maar het gebruik van COUNT (column) is in ieder geval een veel gemaakte fout.

Never underestimate the power of


  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
cameodski schreef op 20 september 2002 @ 10:51:
Doe anders eens COUNT (*). Misschien is dat wat je zoekt.

Ik begrijp helaas nog niet helemaal wat je nou precies terug wilt hebben, dus misschien zoek je dit wel helemaal niet, maar het gebruik van COUNT (column) is in ieder geval een veel gemaakte fout.
Ik zal nog wat duidelijker proberen te zijn .

Dit is dus de query zoals ik hem wil hebben :
SELECT COUNT(TBL_RESPONSE.ANSWER_ID) AS CNT_ANSW,TBL_ANSWER_LANG.
ANSWER_ID, ANSWER_ANSWERTEXT
FROM TBL_ANSWER_LANG
LEFT OUTER JOIN TBL_RESPONSE ON
TBL_RESPONSE.ANSWER_ID = TBL_ANSWER_LANG.ANSWER_ID
WHERE ID = 37
GROUP BY TBL_ANSWER_LANG.ANSWER_ID
Het probleem dus is dat zonder vet gedrukte where statement ik wel de
ANSWER_ID terugkrijg waar de count 0 bij is en dat zodra ik de WHERE toevoeg die velden ineens verdwijnen en alleen velden terugkomen waar de count hoger dan 0 is . ( en dat moet dus niet )

En de count(*) verandert er niet echt veel aan ben ik bang .. :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Basszje schreef op 20 september 2002 @ 10:57:
Ik zal nog wat duidelijker proberen te zijn .

Dit is dus de query zoals ik hem wil hebben :
Ja, die query begrijp ik wel :) , maar niet wat jij nou precies van die query wilt en waarom.
Soms is even een kort verhaaltje over het hoe en waarom wel duidelijk. Misschien zit je wel helemaal op een verkeerd spoor, maar dat kan ik nu niet bedenken.
Nou ben ik natuurlijk ook niet de slimste die hier rondloopt. :P

Never underestimate the power of


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
TBL_ANSWER_LANG.ID = 16?

Verwijderd

En als je die where nou verplaatst naar de left outer join? Dus ipv where een and gebruiken?

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
cameodski schreef op 20 september 2002 @ 11:01:
[...]

Ja, die query begrijp ik wel :) , maar niet wat jij nou precies van die query wilt en waarom.
Soms is even een kort verhaaltje over het hoe en waarom wel duidelijk. Misschien zit je wel helemaal op een verkeerd spoor, maar dat kan ik nu niet bedenken.
Nou ben ik natuurlijk ook niet de slimste die hier rondloopt. :P
Nou ja het idee is dus om uit de ene tabel wat tekst te vissen met een ID waarde die in de andere tabel ( tbl_response ) meerdere keren is opgeslagen :) .

Gaat n.l. over antwoorden. Dus de ene tabel is de antwoord definitie , de ander hoeveel dat antwoord gegeven is .

Dus pak van de definitie de gegevens en van de responses de count van de antwoorden :) . Dat is het idee.

Alleen moet ie dan niet gelijk de hele zut pakken, maar nog aan een aantal andere voorwaarden voldoen dus is er een where statement nodig :) .

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
OK, dan moet je inderdaad GEEN COUNT (*) gebruiken.
Je hebt dus een filter op iets wat in de TBL_RESPONSE tabel zit. Zijn er alleen geen records in deze tabel dan filtert ie het hele ding eruit.

En dan moet je inderdaad de oplossing gebruiken van code4u.

Never underestimate the power of


  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
Ik heb dat van Code4U geprobeerd, een beetje met gerommelt enzo. Maar als ik iets doe als :
LEFT JOIN ON TBL_RESPONSE.ID = TBL_ANSWER.ID AND Q_ID = 14 , dan krijg ik nog steeds alle velden terug, alleen gaat ie raar doen met de count :? .

Lijkt me dus ook niet helemaal de oplossing ?

Ik zat trouwens ook te denken als ik het nou gewoon ranzig doe met een Cartetische prodcut te maken en deze dan te selecteren :? Tis alleen nogal slecht voor de performance denk ik :?

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Verwijderd

Als je een waarde gaat testen in een tabel die je met een LEFT JOIN gejoined hebt gaat de LEFT JOIN stuk als de waarde geen record oplevert en daar is niets aan te doen. Als er wel records voor zouden met TBL_RESPONSE.ID = x zul je waarschijnlijk wel een record terugkrijgen. Wel wet je, als je geen records terugkrijgt, dat de count 0 zou zijn geweest, dus ik zie het probleem niet zo om een extra IFje te plaatsen.

Als je wil weten welke responses meer dan 1 keer zijn gegeven kan je overigens de volgende query gebruiken:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
   COUNT(TBL_RESPONSE.ANSWER_ID) AS CNT_ANSW, 
   TBL_ANSWER_LANG.ANSWER_ID, 
   ANSWER_ANSWERTEXT
FROM 
   TBL_ANSWER_LANG LEFT OUTER JOIN TBL_RESPONSE 
      ON TBL_RESPONSE.ANSWER_ID = TBL_ANSWER_LANG.ANSWER_ID
GROUP BY 
   TBL_ANSWER_LANG.ANSWER_ID
HAVING 
   COUNT(TBL_RESPONSE.ANSWER_ID) > 0

HTH :)

PS: Gebruik code tags ipv quote tags, maak doe de opmaak van de query wat beter, en gebruik niet alleen maar hoofdletters, want de query is zo nauwelijks te lezen.

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
Verwijderd schreef op 20 september 2002 @ 13:28:
Als je een waarde gaat testen in een tabel die je met een LEFT JOIN gejoined hebt gaat de LEFT JOIN stuk als de waarde geen record oplevert en daar is niets aan te doen. Als er wel records voor zouden met TBL_RESPONSE.ID = x zul je waarschijnlijk wel een record terugkrijgen. Wel wet je, als je geen records terugkrijgt, dat de count 0 zou zijn geweest, dus ik zie het probleem niet zo om een extra IFje te plaatsen.

Als je wil weten welke responses meer dan 1 keer zijn gegeven kan je overigens de volgende query gebruiken:
Het probleem is juist dat ik wel de ID's terug wil krijgen met de 0 waardes.
Als ik in jou genoemde statement bij de HAVING ipv check op Count >0 , maar op een andere id ( question_id = 37 bv ) krijg ik keurig netjes de counts terug, behalve de Id waardes die dus niet voorkomen in de response tabel ;(
en die zou ik wel willen terugkrijgen, maar dan met count == 0 .
PS: Gebruik code tags ipv quote tags, maak doe de opmaak van de query wat beter, en gebruik niet alleen maar hoofdletters, want de query is zo nauwelijks te lezen.
Ok. sorry, ik ben een sloddervos :) . En die hoofdletters komen door mysql enzo ( case sensitive enzo ) . Ik zal er op letten iig :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:15

Dido

heforshe

Probeer eens

COALESCE(COUNT(TBL_RESPONSE.ANSWER_ID), 0) AS CNT_ANSW

Weet niet zeker of-tie goed gaat met die count erbij...

Wat betekent mijn avatar?


Verwijderd

de group by klopt nergens.....

Test eerst je query zonder group by functions.
Als je dan de juiste records terug krijgt kun je je group by function (de count in dit geval) toevoegen.
Zorg er dan wel voor dat alle kolommen uit je oorspronkelijke select-clause in je group by voorkomen (zoals het hoort dus)

veel plezier.....

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
Verwijderd schreef op 20 september 2002 @ 14:40:
de group by klopt nergens.....

Test eerst je query zonder group by functions.
Als je dan de juiste records terug krijgt kun je je group by function (de count in dit geval) toevoegen.
Zorg er dan wel voor dat alle kolommen uit je oorspronkelijke select-clause in je group by voorkomen (zoals het hoort dus)

veel plezier.....
Hoezo klopt die group by niet dan :? . Als ik het trouwens zonder die count doe krijg ik precies dezelfde resultaten.

Trouwens ook met dat coalascale ( euh :? ) dingetje. Maakt dus niets uit.
Ligt dus echt aan de left join

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Verwijderd

Basszje schreef op 20 september 2002 @ 15:08:

Hoezo klopt die group by niet dan :?
Dat beschrijf ik : je moet al je kolommen van je select-clause opnemen (ja, dat hoeft niet in mysql (itt) maar ik heb daar al behoorlijk wat problemen mee gehad.)
Als ik het trouwens zonder die count doe krijg ik precies dezelfde resultaten.
Bij een count (een group function) ga je groeperen. Dus.....
Ligt dus echt aan de left join
Daarom zeg ik dat je eerst moet zorgen dat je query goed is.
Als dat de juiste resultaten oplevert (er zijn dan dus records die dubbel voorkomen) kun je je daarna druk maken om je count en kun je minder makkelijk vergissingen maken O-)

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:51

Basszje

Reisvaap!]

Topicstarter
Oke bedankt allemaal voor de goede input :)
Het is helaas niet gelukt, dus ik heb naast de left join een rij inner join gedaan op alle andere tabellen waar die data uit nodig had, dus het werkt nu uiteindelijk wel :) .

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Verwijderd

zo moeilijk is dat toch niet?

voorbeeld op basis van jou situatie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
got_answers;
+-----------+-------------+
| answer_id | answer_text |
+-----------+-------------+
|         1 | a1          |
|         2 | a2          |
|         3 | a3          |
|         4 | a4          |
+-----------+-------------+

got_response;
+-------------+-----------+
| response_id | answer_id |
+-------------+-----------+
|           1 |         1 |
|           2 |         1 |
|           3 |         3 |
|           4 |         3 |
|           5 |         3 |
|           6 |         4 |
+-------------+-----------+


je wilt van alle answers het aantal hebben:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
    ga.answer_id,
    ga.answer_text,
    COUNT(gr.answer_id) AS ans_cnt 
FROM 
    got_answers ga 
LEFT JOIN 
    got_response gr ON ga.answer_id=gr.answer_id 
GROUP BY 
    ga.answer_id,ga.answer_text;

resultaat:
+-----------+-------------+---------+
| answer_id | answer_text | ans_cnt |
+-----------+-------------+---------+
|         1 | a1          |       2 |
|         2 | a2          |       0 |
|         3 | a3          |       3 |
|         4 | a4          |       1 |
+-----------+-------------+---------+
correct

voorbeeld met where, waar de uitkomst 0 moet zijn (zie boven answer_id=2)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
    ga.answer_id,
    ga.answer_text,
    COUNT(gr.answer_id) AS ans_cnt 
FROM 
    got_answers ga 
LEFT JOIN 
    got_response gr ON ga.answer_id=gr.answer_id 
WHERE 
    ga.answer_id=2
GROUP BY 
    ga.answer_id,ga.answer_text;

resultaat:
+-----------+-------------+---------+
| answer_id | answer_text | ans_cnt |
+-----------+-------------+---------+
|         2 | a2          |       0 |
+-----------+-------------+---------+
correct

nu nog even een voorbeeld waarvan er wel waarde is (answer_id=3)

weer hetzelfde:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
    ga.answer_id,
    ga.answer_text,
    COUNT(gr.answer_id) AS ans_cnt 
FROM 
    got_answers ga 
LEFT JOIN 
    got_response gr ON ga.answer_id=gr.answer_id 
WHERE 
    ga.answer_id=3
GROUP BY 
    ga.answer_id,ga.answer_text;

+-----------+-------------+---------+
| answer_id | answer_text | ans_cnt |
+-----------+-------------+---------+
|         3 | a3          |       3 |
+-----------+-------------+---------+
correct


nog even voor performance check EXPLAIN gebruiken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
EXPLAIN 
SELECT 
    ga.answer_id,
    ga.answer_text,
    COUNT(gr.answer_id) AS ans_cnt 
FROM 
    got_answers ga 
LEFT JOIN 
    got_response gr ON ga.answer_id=gr.answer_id 
WHERE 
    ga.answer_id=3
GROUP BY 
    ga.answer_id,ga.answer_text;

+-------+-------+---------------+-----------+---------+-------+------+-------------+
| table | type  | possible_keys | key       | key_len | ref   | rows | Extra       |
+-------+-------+---------------+-----------+---------+-------+------+-------------+
| ga    | const | PRIMARY       | PRIMARY   |       1 | const |    1 |             |
| gr    | ref   | answer_id     | answer_id |       1 | const |    2 | Using index |
+-------+-------+---------------+-----------+---------+-------+------+-------------+
netjes :)


sql valt wel mee toch :+

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
       Productcategorieen.ProductcatNaam,
       Productcategorieen.ProductcatId, 
       Count(Productcategorieen.ProductcatId) AS Aantal 
FROM 
     Producten, 
     Productcategorieen 
LEFT JOIN 
     Productcategorieen P ON Productcategorieen.ProductcatId  = Producten.ProductSoort 
GROUP BY 
      Productcategorieen.ProductcatId 
ORDER BY 
      ProductcatNaam ASC


De count doet hier heel raar.
Er komt 7,5,3 ipv 2,1,0 wat zou moeten.
Ziet iemand hier het probleem

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Het probleem is dat je geen FAQ's leest. Programming FAQ - SQL: Hoe werkt dat GROUP BY nu eigenlijk?

Verder is het hier niet gewenst om oude topics van in dit geval ruim 4 jaar oud omhoog te schoppen met een eigen vraag waarin je een minimale hoeveelheid eigen inzet ten toon spreidt. Zie Programming Beleid - De "quickstart" voor richtlijnen hoe het wel hoort; mocht je problemen blijven houden, dan kun je volgens die richtlijnen een nieuw topic openen. :)

'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.

Pagina: 1

Dit topic is gesloten.