Avatar billede suntrip Nybegynder
24. september 2002 - 13:57 Der er 8 kommentarer og
3 løsninger

SELECT problem

har et problem med at få valgt de rigtige data'er ud af 2 af mine tabeller og har efterhånden prøvet alt.. men intet virker helt som det skal.. desværre :(

så jeg håber at der er en venlig sjæl som kan hjælpe mig med at få det løst :)

skal have lavet en "ignore" funktion som jeg skal bruge til en skole opgave... jeg har 3 tabeller til det...

tbl_bruger  col_bruger_id

tbl_ignore_bruger  col_bruger_id  col_ignorebruger_id

tbl_besked col_indhold_id col_indhold col_afsender_id col_modtager_id


col_bruger_id er auto_increment


det skal så fungere så ledes at f.eks BrugerID nr 1 skal hente alle beskeder der er til ham, men fravælge de beskeder fra de personer som han har sat på ignore


håber at min forklaring er god nok, ellers må i/du jo lige sige til
Avatar billede suntrip Nybegynder
24. september 2002 - 14:03 #1
har haft spørgsmålet oppe at vende før, men fik ikk lige det ønsket resultat.. desværre, men det skyldtes nok at jeg ikke forklaret det ordenligt...

så jeg håber at det oki at jeg spørger igen.... for min hjerne er ved at brænde sammen over det her :(((
Avatar billede cyb Nybegynder
24. september 2002 - 14:21 #2
Skal problemet løses i MySQL eller er det en rent teoretisk opgave med fokus på sql92 ?
Avatar billede eky Nybegynder
24. september 2002 - 14:38 #3
Her er mit forsøg på en select. Du må selv sørge for at tilrette syntaksen, men så har du da en ide.
Select from tbl_besked
where col_modtager_id = BrugerID
  and col_afsender_id not in
  (Select col_ignorebruger_id
      from tbl_ignore_bruger
    where col_bruger_id = BrugerID)
Avatar billede proaccess Nybegynder
24. september 2002 - 14:41 #4
SELECT be.*
FROM tbl_besked be LEFT JOIN tbl_ignore_bruger ig ON be.col_modtager_id=ig.col_bruger_id
WHERE be.col_bruger_id=1234 And ig.col_ignorebruger Is Null;

>eky: Understøtter MySQL sub-select??
Avatar billede eky Nybegynder
24. september 2002 - 14:55 #5
>proaccess: Ups, det har du da ret i, at MySQL ikke gør (måske i version 4)
Jeg måtte lige kigge i manualen, og der er det beskrevet præcis som du skriver.

1.7.4.1 SubSELECTs
MySQL Server currently only supports nested queries of the form INSERT ... SELECT ... and REPLACE ... SELECT .... You can, however, use the function IN() in other contexts. Subselects are currently being implemented in the 4.1 development tree.

Meanwhile, you can often rewrite the query without a subselect:

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
This can be rewritten as:

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
The queries:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
                                      WHERE table1.id=table2.id);
Can be rewritten as:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
                                      WHERE table2.id IS NULL;
Avatar billede suntrip Nybegynder
24. september 2002 - 15:17 #6
takker :)

det ser jo ud til at virke næsten som det skal.... der er bare et lille problem...

SELECT be.*
FROM tbl_besked be LEFT JOIN tbl_ignore_bruger ig ON be.col_modtager_id=ig.col_bruger_id
WHERE be.col_bruger_id=1234 And ig.col_ignorebruger Is Null;

vælger alt hvad Bruger nr 1234 har skrevet... og ikke hvad alle andre har skrevet... :(

så derfor prøvet jeg at sætte WHERE be.col_bruger_id != 1234 istedet for...

hvilket resulteret i at den ikk fravælger de BrugerID'er som bruger nr 1234 har sat på ignore :(

hvad gør jeg forkert
Avatar billede davidfossil Nybegynder
24. september 2002 - 16:17 #7
SELECT be.*
FROM tbl_besked be LEFT JOIN tbl_ignore_bruger ig ON be.col_afsender_id=ig.col_bruger_id
WHERE be.col_modtager_id_id=1234 And ig.col_ignorebruger Is Null;
Avatar billede suntrip Nybegynder
24. september 2002 - 19:05 #8
:)) nu er jeg tæt på...

ændret lidt på davidfossils SELECET

SELECT be.* , us.col_brugernavn
FROM tbl_besked be , tbl_bruger us

LEFT JOIN tbl_ignore_bruger ig
ON be.col_bruger_id=ig.col_ignorebruger_id AND ig.col_bruger_id = 1234

WHERE  be.col_bruger_id != 1234 And be.col_bruger_id = us.col_bruger_id And ig.col_ignorebruger_id Is Null;


men der er stadig et problem.... for de person bruger nr 1234 har sat på ignore... de kan godt modtager beskeder fra 1234 :(


men jeg takker mange gange for den hjælp jeg har fået indtil videre... håber at en af jer lige kan klare den sidste del... så vil jeg være en glad kartoffel :)
Avatar billede proaccess Nybegynder
25. september 2002 - 07:26 #9
Hvis du er ligeglad med hvem, som er modtager, så kan du slette den del af WHERE...

SELECT be.*
FROM tbl_besked be LEFT JOIN tbl_ignore_bruger ig ON be.col_modtager_id=ig.col_bruger_id
WHERE ig.col_ignorebruger Is Null;
Avatar billede suntrip Nybegynder
25. september 2002 - 10:37 #10
det er jeg desværre ikke :(


prøver at forklare mig selv igen :)


Bruger nr 1 skal ikke kunne modtage beskeder fra bruger nr 2 hvis han er sat på ignore... Det er sådan SELECT'en fungere nu :)

MEN den tager ikk hensyn til at bruger nr 2 godt kan modtage beskeder fra bruger nr 1.... hvilket ikke er fedt :(

problemet kunne nok løsses ved at begge sat hinanden på ignore... sådan nr 1 sat nr  på ingore og bruger nr 2 satte nr 1 på ignore... men jeg vil helst gerne undgå gentagende data
Avatar billede suntrip Nybegynder
26. september 2002 - 14:00 #11
ser ud til at jeg har fået løst den sidste del selv :)

så jeg takker mange gange for det hjælp jeg har fået....
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