Avatar billede troldepige Nybegynder
28. januar 2008 - 15:14 Der er 15 kommentarer og
1 løsning

Subquery problem.. Select skal kunne fravælge en bestemt id..

Sagen er, at jeg skal udelukke medlemsIDer, der forekommer i samme tabelle når de forekommer en gang med en bestemt værdi. Derfor har jeg brug for at kunne køre en subquery og det vil den bare ikke..

Det drejer sig om en tabelle, hvor en klub kan opdatere alle medlemmer, der har betalt. Dvs. tabellen består af medlemid og året, der er blevet betalt for. Nu forekommer altså f.eks. medlemID 5 for hvert år, medlemmet har indbetalt for.

Men nu skal klubben kunne se, alle medlemmer, der ikke har betalt for et bestemt år. Med forespørgslen nedenfor trækker den så selvfølgelig medlemID 5 op for hvert anden år, end som sent med i URLen. Den udelukker den ikke, fordi den har betalt i vedkommende år.

"SELECT * FROM medlemmer LEFT JOIN kontingent ON medlemmer.medlemID = kontingent.medlemID WHERE YEAR(medlemmer.tilmelddato) <='$colname_medlemmer'  AND kontingent.aar != '$colname_medlemmer' ORDER BY medlemmer.enavn, medlemmer.fnavn ASC";

Så forespørgslen skulle gerne være lignende:

"SELECT * FROM medlemmer LEFT JOIN kontingent ON medlemmer.medlemID = kontingent.medlemID WHERE YEAR(medlemmer.tilmelddato) <='$colname_medlemmer'  AND kontingent.aar != '$colname_medlemmer' AND medlemmer.medlemID NOT IN (SELECT kontingent.medlemID WHERE kontingent.aar = '$colname_medlemmer') ORDER BY medlemmer.enavn, medlemmer.fnavn ASC";

'$colname_medlemmer' = året, som Urlen sender med..

Her skal den bare udelukke alle de forekomster med kontingent.medlemID, som forekommer i tabellen med en indbetaling for kontingent.aar, der bliver sent med i URLen. Dog denne forespørgsel giver følgende fejlmeddelse: "You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT kontingent.medlemID WHERE kontingent.aar = '2005') ORDER"

SNØFT!

Håber, nogen kan og gider hjælpe..
Avatar billede erikjacobsen Ekspert
28. januar 2008 - 18:44 #1
Hvilken mysql-version anvender du?
Avatar billede troldepige Nybegynder
28. januar 2008 - 19:19 #2
Det er MySQL klientversion: 4.1.22
Avatar billede erikjacobsen Ekspert
28. januar 2008 - 19:45 #3
Så understøtter den subselects - så kan det være den mangler et FROM og en tabel i den SELECT, der giver fejl.
Avatar billede troldepige Nybegynder
28. januar 2008 - 20:14 #4
Hejsa igen. Tusind tak for hjælp og svar, dog desværre, den laver samme fejlmeddelse..
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT kontingent.medlemID FROM kontingent WHERE kontingent.aar
Avatar billede erikjacobsen Ekspert
28. januar 2008 - 20:25 #5
Mnnjah, subselects er understøttet fra 4.1, men der er vist noget om, at hvis de bliver for komplekse så går det galt. Det kan være den kræver mysql 5 - jeg har desværre ikke lige tid til at prøve efter.
Avatar billede troldepige Nybegynder
28. januar 2008 - 21:00 #6
ok, men tusind tak i hvert fald.. Lige nu prøver jeg at få det løst på anden vis. Hvis jeg nu kunne gemme alle medlemID er i en array, som så skal gemmes i en variabel og jeg i forespørgsel så tilføjer

AND WHERE medlemID != $betaltIDer

..men hvordan gemmer man alle medlemIDer i en variabel? Ved du det måske lige.. ;o)

God nat herfra i hvert fald og takker.
Avatar billede recli Nybegynder
30. januar 2008 - 11:05 #7
Hej

Hvis du har dine data, som jeg forstår på din beskrivelse, dvs. en medlemstabel og en tabel for kontingent, skal du blot lave en left join efter følgende mønster for at finde alle dem, der ikke har betalt:

mysql> select id,navn,aar from medlemmer left outer join kontingent on (id=mId and aar='2008') where aar is null;
+----+-----------+------+
| id | navn      | aar  |
+----+-----------+------+
|  3 | Charlotte | NULL |
+----+-----------+------+


Hilsen
  /Lars
Avatar billede troldepige Nybegynder
30. januar 2008 - 13:30 #8
Tak for hjælpen, men sagen er, at den jo også viser medlemmerne, der har betalt for et andet år. Dvs. at medlemID med år 2006 bliver hivet op, selvom det samme medlem har betalt det år, som urlen har (f.eks. 2008). Den skal slet ikke vise de medlemmer, der har betalt i 2008, uanset om de har indbetalt andre år.

Jeg tror, at det kun kan løses ved at trække medlemmer, der har betalt og dermed ikke skal vises, ud i en anden query. Så skal de indsættes i en variabel og denne variabel skal så den query få med i.

MEN HVORDAN kan man smide alle medlemmerider, der har betalt i et array og så en variabel? Noget med explode og implode? Nogen, der ved hvordan det kan gøres?

SELECT * FROM medlemmer, kontingent ON medlemmer.medlemID = kontingent.medlemID WHERE kontingent.aar = '$colname_medlemmer';

$medlemmerbetalt = ???

"SELECT * FROM medlemmer LEFT JOIN kontingent ON medlemmer.medlemID = kontingent.medlemID WHERE kontingent.aar != '$colname_medlemmer' AND medlemmer.medlemID != $medlemmerbetalt";
Avatar billede recli Nybegynder
30. januar 2008 - 13:42 #9
Nej, fordi du både joiner på medlemsId og årstal og derefter med en WHERE-betingelse siger, at du kun vil have de personer, hvor årstallet er null (dvs. dem for hvem der ikke findes en linje i kontingenttabellen med årstal 2008), finder forespørgslen kun de personer, der ikke har betalt for 2008 (din parameter fra URL'en).

Som du kan se af mit lille eksempel, viser den ikke de to medlemmer med id'er 1 og 2, fordi de begge har betalt for 2008.
Avatar billede troldepige Nybegynder
30. januar 2008 - 13:54 #10
jo, det ville være dejligt. Det er bare, at der kun er rækker hvor hver opdatering af medlemmer, der har betalt. Dvs. der er ingen rækker med null..

Systemer skriver hvert nyt medlem i medlemmer. Herefter går man ind når medlemmet så fik betalt kontingent og så tager den medlemID fra medlemmer og skriver medlemID og årstal i kontingent.
Avatar billede recli Nybegynder
30. januar 2008 - 15:21 #11
Hej igen...

Når du laver en 'left join' på den måde, jeg har beskrevet, så er der null-værdier, du kan checke på. Det skyldes at der laves en linje for hver bruger i medlemstabellen - ligegyldigt om vedkommende faktisk har en linje med det rigtigte årstal i kontingent-tabellen. Hvis kombinationen af medlemsId og årtal ikke findes i kontingenttabellen, sættes disse værdier til null for brugeren.

Så vi får altså for hver bruger en linje (før WHERE-betingelsen smider nogle væk), der ser således ud:

brugerId1, brugernavn1, 2008
brugerId2, brugernavn2, 2008
brugerId3, brugernavn3, null
brugerId4, brugernavn4, 2008

Med where-betingelsen IS NULL sorterer vi de uønskede rækker væk.

Jeg skal måske lige specificere, at
1. brugerId og brugernavn kommer fra medlemstabellen
2. årstal fra kontingenttabellen

Årstal vil derfor være null, for de brugere der ikke findes i kontingenttabellen med hhv. medlemsId og årstal=2008.

/Lars
Avatar billede troldepige Nybegynder
31. januar 2008 - 21:02 #12
Åbenbart kom min hyldestsang til dig ikke på.. Derfor prøver jeg lige igen. TUSIND TAK. Du er en HELT og jeg har lært igen noget. Det virker og det er bare dejligt!
God weekend!
Avatar billede recli Nybegynder
01. februar 2008 - 08:29 #13
Tak for tilbagemeldingen, 'troldepige'.
Avatar billede recli Nybegynder
06. februar 2008 - 14:24 #14
Hej igen, troldepige.

Jeg tror, at du skal lukke din forespørgsel, så dit spørgsmål ikke bliver ved med at stå som ubesvaret.
Avatar billede recli Nybegynder
06. februar 2008 - 14:28 #15
Undskyld, det kan da også godt være, at jeg skulle have angivet min kommentar som et svar, for at du kan gøre det.
Avatar billede troldepige Nybegynder
06. februar 2008 - 15:36 #16
Joda kære Recli. så har jeg d.. ;o) Fortsat en go´dag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester