My SQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Bart

Bart

16/12/2005 11:40:00
Quote Anchor link
Hoi beste vrienden,

heel veel ervaring met sql heb ik niet maar ik denk toch dat het mogelijk moet zijn om voor volgend probleem een statement te vinden.

Ik heb een tabel met klanten id's. Elk jaar dat de klant opnieuw lid word/is krijgt hij een record met zijn id en het jaar waarvoor hij lid werd.

Nu wil ik een lijst met alle klanten die wel lid waren in 2005, maar nog niet in 2006. Dit lijkt simpel, maar ik krijg er geen kop aan. Ik heb geprobeerd met :

select *, count(id) as sum from tabel
where jaar>2004
group by id
having sum=1.

Dit geeft me wel alle records van mensen die enkel betaalden in 2005, maar ook de nieuwe leden, dus diegene die enkel betaalden in 2006 staan hier bij. Niet de bedoeling dus. Iemand suggesties??
Alvast van harte bedankt
Bart
Gewijzigd op 16/12/2005 11:43:00 door Bart
 
PHP hulp

PHP hulp

11/06/2024 00:50:27
 
Onbekend onbekend

onbekend onbekend

16/12/2005 11:43:00
Quote Anchor link
Zou je de tabelstructuur hier ff kunnen posten??

Maar, het zou zo denk ik ook moeten kunnen werken:

"where jaar>2004 and jaar <2006"
 
Onbekend onbekend

onbekend onbekend

16/12/2005 11:44:00
Quote Anchor link
* sry, onzin post...
Gewijzigd op 16/12/2005 11:45:00 door onbekend onbekend
 
Bart

Bart

16/12/2005 11:46:00
Quote Anchor link
Welnee, dan geeft hij enkel de records van de betalers in 2005, dat wil ik niet. Ik wil weten wie een record heeft voor 2005 én niet voor 2006

De tabelstructuur is eenvoudig, enkel id en jaar.
 
Barman V

Barman V

16/12/2005 11:53:00
Quote Anchor link
Ik denk dat je hier 2 tabellen voor nodig hebt

KLANT
klantid
naam
adres
postcode
woonplaats

KLANT_LID
klantid
jaartal

De tabel klant is dan verbonden met klant_lid dmv de klantid.

Nu kan je heel makkelijk via een sql-query de klanten eruit halen die lid waren in 2005, maar niet in 2006.

Voorbeeld
SELECT *
FROM klant LEFT OUTER JOIN klant_lid ON (klant.klantid = klant_lid.klantid)
WHERE jaartal = 2005
AND jaartal <> 2006

edit:
Je hebt hier echt 2 tabellen voor nodig (1e normaalvorm), anders dan krijg je dubbele gegevens in je database. Dan krijg je bijvoorbeeld 3 keer dezelfde klantgegevens, maar met een ander jaartal.
Gewijzigd op 16/12/2005 11:56:00 door Barman V
 
Bart

Bart

16/12/2005 11:55:00
Quote Anchor link
Ok, dit is ook het geval (2 tabellen)
ga dit meteen proberen
bedankt
 
Barman V

Barman V

16/12/2005 11:58:00
Quote Anchor link
Als je het aantal hits wilt weten, dan kan dat eenvoudig met de functie

echo mysql_affected_rows();

edit:
In de query haal je namelijk alleen de klantgegevens op, maar niet het aantal.
Gewijzigd op 16/12/2005 11:59:00 door Barman V
 
Bart

Bart

16/12/2005 11:58:00
Quote Anchor link
Dit geeft me toch gewoon alle records van 2005 ? wat ook blijkt uit mijn resultaat
 
Bart

Bart

16/12/2005 12:00:00
Quote Anchor link
Dit was het volledige statement dat ik gebruikte voorheen

SELECT * , COUNT( historiek.id ) AS sum
FROM historiek
INNER JOIN ab_contacts ON ( historiek.id = ab_contacts.id )
WHERE historiek.jaar >2004
GROUP BY historiek.id
HAVING SUM=1

Dit gaf me netjes alle klanten van 2005 die geen record hadden van 2006, maar het gaf me ook de klanten die enkel een record hadden voor 2006
:(:(
 
Jan Koehoorn

Jan Koehoorn

16/12/2005 12:38:00
Quote Anchor link
Hoi Bart,

als je even precies je tabelstructuur van die twee hier plakt, kan ik je misschien helpen.
 
Bart

Bart

16/12/2005 12:40:00
Quote Anchor link
Tabel Historiek :
id int(11) No 0
jaar int(11) No 0
datumbet date No 0000-00-00
bedrag double No 0
wijze varchar(50) No
aantal_abo int(11) No 0
te_schrapp date No 0000-00-00
hid int(11) No auto_increment
pczip varchar(10) No
pccity varchar(50) No

Tabel klanten :

id int(11) No 0
user_id int(11) No 0
addressbook_id int(11) No 0
source_id int(11) No 0
group_id int(11) No 0
first_name varchar(50) No
middle_name varchar(50) No
last_name varchar(50) No
initials varchar(10) No
title bigint(10) No 0
sex enum('M', 'F') No M
birthday date No 0000-00-00
email varchar(100) No
company_id int(11) No 0
department varchar(50) No
function varchar(50) No
home_phone varchar(20) No
work_phone varchar(20) No
fax varchar(20) No
work_fax varchar(20) No
cellular varchar(20) No
country varchar(50) No
state varchar(50) No
city varchar(50) No
pccity varchar(50) No
zip varchar(10) No
pczip varchar(10) No
address varchar(100) No
address_no varchar(10) No
comment varchar(50) No
 
Jan Koehoorn

Jan Koehoorn

16/12/2005 12:46:00
Quote Anchor link
En verwijst historiek.id naar klanten.id?
 
Bart

Bart

16/12/2005 12:47:00
Quote Anchor link
ja hoor, via die inner join (klanten is hier dus ab_contacts en de betalingen staan in historiek)
 
Jan Koehoorn

Jan Koehoorn

16/12/2005 12:53:00
Quote Anchor link
Goed, ga ik ff piekeren. Je wilt dus eigenlijk een lijst van klanten die zich nog niet heringeschreven hebben voor het nieuwe jaar. Geef me ff een kwartiertje!
 
Bart

Bart

16/12/2005 12:54:00
Quote Anchor link
Wel alvast van harte bedankt !!
 
Frank -

Frank -

16/12/2005 12:57:00
Quote Anchor link
Werkt dit misschien:
SELECT id, jaar
FROM Historiek
GROUP BY id
HAVING(jaar <> 2006)

De kolom jaar kun je volgens mij beter omzetten in het type YEAR, het is nu een INT.
 
Niels

Niels

16/12/2005 13:00:00
Quote Anchor link
Nog 8 minuten Jan ! ;) komop je kan het :D
 
Bart

Bart

16/12/2005 13:00:00
Quote Anchor link
Nope Frank, dit is niet wat ik zocht, toch bedankt
 
Jan Koehoorn

Jan Koehoorn

16/12/2005 13:06:00
Quote Anchor link
Deze is lastig zeg! Eigenlijk moet je records hebben die nog niet aanwezig zijn :-)
 
Bart

Bart

16/12/2005 13:08:00
Quote Anchor link
inderdaad, hij lastig !! ik ben er al een tijdje mee bezig ;).

Wat ook zou kunnen is het volgende :
ik kan de tabel (historiek) kopieren naar een andere tabel, en alle records van klanten die enkel een betaling hadden in 2006 verwijderen. Moest dit kunnen dan kan mijn vorig statement werken.

Maar Delete met veel parameters??? ik zou het niet weten..
 
Frank -

Frank -

16/12/2005 13:16:00
Quote Anchor link
Vreemd dat het niet werkt, bij mij gaat het prima. Zodra een id (ook) een abonnement in 2006 heeft, komt deze niet meer voor in de resultaten van de query.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.