[MySql]Query probleem met COUNT(*)

Pagina: 1
Acties:
  • 137 views sinds 30-01-2008
  • Reageer

  • Sneak0r
  • Registratie: Februari 2002
  • Laatst online: 21-08 13:51
Ik zit met het volgende probleem.

Ik heb 2 tabellen, als volgt:

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
25
26
27
28
29
30
# Tabel structuur voor tabel `aanbiedingen`

CREATE TABLE aanbiedingen (
  id int(10) NOT NULL auto_increment,
  klant_id varchar(10) NOT NULL default '',
  titel varchar(100) NOT NULL default '',
  prijs varchar(20) default NULL,
  opmerking text,
  datum varchar(25) NOT NULL default '',
  sid varchar(50) NOT NULL default '',
  PRIMARY KEY  (id),
  KEY id (id,isbn)
) TYPE=MyISAM;

# Tabel structuur voor tabel `klant`

CREATE TABLE klant (
  id int(10) NOT NULL auto_increment,
  email varchar(100) NOT NULL default '',
  telnr varchar(100) NOT NULL default '',
  wachtwoord varchar(100) NOT NULL default '',
  naam varchar(100) NOT NULL default '',
  straat varchar(255) default NULL,
  postcode varchar(10) default NULL,
  woonplaats varchar(255) default NULL,
  sid varchar(50) NOT NULL default '',
  afd varchar(15) NOT NULL default '',
  ip varchar(150) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;


Hier moet ik bijzeggen dat 'sid' een uniek id is net als het gewone id, alleen deze is random gegenereerd ivm beveiliging ed.

Het gaat om een query die laat zien welke mensen een aanbieding hebben geplaatst op de website (hoevaak de sid code v/d klant overeenkomt
met die van de aanbieding) en ook hoeveel aanbiedingen.
dit is gelukt adhv de volgende query:

code:
1
2
3
SELECT klant.*, aanbiedingen.*, count(*) AS aantal FROM klant, aanbiedingen 

WHERE klant.sid=aanbieding.sid GROUP BY klant.id ORDER by klant.id ASC


Nu wil ik echter ook een query maken die laat zien welke klanten geen aanbiedingen hebben geplaatst, ik heb al geprobeerd met JOINS ed. te werken
maar het is me tot dusver niet gelukt, ik heb gezocht met de search en met google. Ook adhv. deze website
en topic [rml][ MySQL] left join en count met uitkomst 0[/rml] ben ik er niet uitgekomen :( , alvast bedankt voor de hulp!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Normaal gesproken met een not exists sub query maar dat wordt dus niet ondersteund door mysql
Het antwoord blijft met een left outer join. waarbij de ID van de gejoinde tabel NULL is. Dan heeft 'ie namelijk geen record kunnen vinden.
Als je er niet uitgekomen bent met dat andere topic kan je beter hier even laten zien wat je hebt geprobeerd, dan kunnen we daarin bijsturen. Je zit dus op de goede weg.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 22:02
't Eerste wat in mij opkomt is het volgende:
SELECT distinct(klant.id) FROM klant, aanbieding WHERE klant.sid=aanbieding.sid

Dan weet je welke klanten er een aanbieding hebben geplaatst. Vervolgens doe je dit:
SELECT .... FROM klant, aanbieding WHERE klant.id NOT IN (<hier een lijst van id's uit de vorige query welke met een , zijn gescheiden>)

Zodra MySQL subquery's ondersteund kun je die eerste query op de plek van de lijst neer zetten. (Die lijst moet je dus nu zelf programmatisch genereren)

Maar goed, misschien is er nog wel een mooiere/betere oplossing hoor :)

[ Voor 3% gewijzigd door Jelmer op 02-02-2003 11:29 ]


  • Sneak0r
  • Registratie: Februari 2002
  • Laatst online: 21-08 13:51
Jelmer schreef op 02 February 2003 @ 11:28:
...

Zodra MySQL subquery's ondersteund kun je die eerste query op de plek van de lijst neer zetten. (Die lijst moet je dus nu zelf programmatisch genereren)

Maar goed, misschien is er nog wel een mooiere/betere oplossing hoor :)
Hier was ik nog niet opgekomen _/-\o_ ik ga het meteen even proberen.

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
code:
1
2
3
4
5
SELECT k.id, COUNT( k.id )
FROM klant k
LEFT JOIN aanbieding a
ON k.sid = aanbieding.sid
GROUP BY k.id


Maar misschien moet je toch eens naar je datamodel kijken. Er zitten dubbele velden in, velden die uniek moeten zijn die het niet zijn. :o

  • Blizard
  • Registratie: September 2001
  • Niet online
edit:

Te laat

[ Voor 92% gewijzigd door Blizard op 02-02-2003 12:09 ]


  • Sneak0r
  • Registratie: Februari 2002
  • Laatst online: 21-08 13:51
Bedankt voor jullie replies! Adhv. de query van Gert is het me gelukt. Thnx :>

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Geen wonder dat het je met de query van Gert is gelukt. Hij heeft het namelijk voor je ingetikt. Ik heb je het complete antwoord gegeven. Je laat niet zien dat je er zelf veel energie in hebt gestoken om het antwoord te vinden. Je geeft geen reactie op mijn vraag om je statement dat je zelf hebt gevormd te posten.

IMHO zouden mensen als Gert en misschien ook Blizard (voor de edit?) niet in moeten gaan op dit soort script request? Het is heel aardig, maar niet in de geest van dit forum.

Sorry moderators, ik kon het niet laten een opmerking te plaatsen

[ Voor 8% gewijzigd door Goodielover op 03-02-2003 09:28 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 24-08 16:37


Het is hier niet de bedoeling om een 'race' te houden om de juiste oplossing kant en klaar in te typen.
Dit forum is niet bedoeld om zomaar stukjes code te posten, het is de bedoeling dat iemand met een probleem geholpen wordt, maar wel op zo'n manier dat hij er iets van bijleert. En dat gebeurt niet door kant en klare code te posten.

* whoami agrees dus met de post van goodielover.

https://fgheysels.github.io/


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Zoals topicstarter al zei had hij met joins gewerkt maar het lukt niet. Wat is er dan mis met een minimaal voorbeeld? Je kan iemand idd een week laten aan modderen terwijl hij nu ziet "ha dat werkt, kijken of ik het de volgende keer zelf kan"
Bovendien deed mijn query niets anders dan id's aanelkaar koppelen. Topic starter moet zelf nog aan de slag om de query uit te breiden.

Je kan zeggen wat je wil maar zeggen dat ik kant en klare code postte is gewoon onzin.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Laat maar.
Sorry voor de kick.

PS SneakOR, je hebt nog een HEAVING nodig om te testen op COUNT (*) = 0

[ Voor 93% gewijzigd door Goodielover op 03-02-2003 09:58 ]


  • Sneak0r
  • Registratie: Februari 2002
  • Laatst online: 21-08 13:51
Goodielover schreef op 03 February 2003 @ 09:55:
Laat maar.
Sorry voor de kick.

PS SneakOR, je hebt nog een HEAVING nodig om te testen op COUNT (*) = 0
Ik heb de query ook niet letterlijk overgenomen en ben zelf ook nog aan het zoeken geweest en heb jou replie (net als die van de rest) ook zeker meegenomen.

Tot slot kwam ik ook tot de query die het goede resultaat weergaf:

SELECT klant.* FROM klant LEFT JOIN aanbiedingen ON klant.sid=aanbiedingen.sid where boek.sid IS NULL

Nogmaals bedankt.
Pagina: 1