Avatar billede m_sorensen Nybegynder
25. februar 2004 - 11:28 Der er 28 kommentarer og
1 løsning

SQL sætning

Hej eksperter

Jeg skal bruge en SQL sætning, som vælger alle de poster fra tabel1 hvor der ikke er nogen poster i tabel2 som er relateret.

tabel1 indeholder nyheder og tabel2 indeholder kommentarer til nyheder. Så jeg skal altså bruge alle de nyheder, som ikke er kommenterede.

Nogle forslag ?
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 11:36 #1
Du skal bruge et Left Outer Join, som du kan læse om her:
http://activedeveloper.dk/aspdigital/2003062001.asp

Kan godt komme med et eksempel, men det er lidt svært når jeg ikke kender din database bedre.
Avatar billede madschristensen Nybegynder
25. februar 2004 - 11:41 #2
Eller nested SQL:
Select *
From Nyheder
where nyhedsid not in (select Nyhedsid From Kommentarer)
;
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 11:41 #3
Jeg har lige hurtigt prøvet, og umiddelbart ser det ud til at den vælger alle poster fra tabel1

Mit eksempel:
SQL = "SELECT news.id, news.topic, news.addeddate FROM news LEFT OUTER JOIN comments ON comments.newsid = news.id;"

Hvad gør jeg galt ?
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 11:43 #4
m_sorensen >> HVad sker der hvis du skriver Right istedet for left ?
eller evt skriver:

SQL = "SELECT news.id, news.topic, news.addeddate FROM news LEFT OUTER JOIN comments ON news.id = comments.newsid;"
Avatar billede madschristensen Nybegynder
25. februar 2004 - 11:49 #5
SQL="Select news.id, news.topic, news.addeddate FROM news WHERE news.id not in (Select comments.newsid FROM comments);"
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 11:56 #6
Jeg prøver lige begge svar, men serveren er lige død for mig :/
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 12:37 #7
Jacobclausen >> Dit forslag hiver stadig alle poster fra tabel1 ud.

madschristensen >> jeg får en syntax fejl med dit forslag
Avatar billede madschristensen Nybegynder
25. februar 2004 - 12:43 #8
Hmmm...

SQL="Select id, topic, addeddate FROM news WHERE id not in (SELECT newsid FROM Comments);"

Hvilken database bruger du ?
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 12:47 #9
mySQL
Avatar billede madschristensen Nybegynder
25. februar 2004 - 12:59 #10
Sætningen virker i db2 og SAS...
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 13:01 #11
m_sorensen >> Ja når du bruger mysql tror jeg du er nødt til at bruge noget Join. Prøv at læse artiklen igennem, som jeg henviser til, og find den rette funktion.
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:02 #12
Men den er der jo ikke.. jeg kan, efter hvad jeg kan se, kun finde de poster fra tabel1 hvor joinet til tabel2 holder, og ikke omvendt.
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:03 #13
Jf. denne side:
http://www.mysql.dk/doc/en/Comparisons_using_subqueries.html
skal syntax være:

SQL="Select id, topic, addeddate FROM news WHERE id <> ANY (Select newsid FROM Comments);"
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:06 #14
Prøver
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 13:07 #15
Min fejl! Om Inner join står der:

Ved at lave en INNER JOIN der relaterer felterne typeid i tabellerne kunder og kundetype vil resultatet blive de poster fra tabellen kunder som har en relateret post i kundetype. Altså de felter hvor kundetypeid = kundetypeid.


Og det er vel det du skal have?
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:09 #16
[TCX][MyODBC]You have an error in your SQL syntax near '(SELECT newsid FROM comments)' at line 1
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:09 #17
jakobclausen >> det er lige det modsatte jeg skal have. Jeg skal have alle de poster som ikke har en relateret post.
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 13:09 #18
SELECT news.id, news.topic, news.addeddate FROM news
INNER JOIN comments ON news.id=comments.news
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:13 #19
alternativt kan du benytte exist (eller rettere NOT)

http://www.mysql.dk/doc/en/EXISTS_and_NOT_EXISTS_subqueries.html
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:15 #20
jakobclausen >> den tager stadig alle poster fra tabel1 hvor den finder en relateret post i tabel2
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:17 #21
SELECT id, topic, addeddate FROM news
  WHERE NOT EXISTS (SELECT news.id, news.topic, news.addeddate FROM news
INNER JOIN comments ON news.id=comments.news);

Så har du brugt begge løsninger *GGG*
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:19 #22
Og så vil sætningen skulle se sådan ud:

SQL = "SELECT news.id, news.name, news.addeddate FROM news WHERE NOT EXISTS (SELECT newsid FROM comments WHERE comments.newsid = news.id);"

men den giver en syntax fejl
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:21 #23
Nej sådan kan den ikke se ud, men prøv lige den oppe over...
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:22 #24
samme fejl... :(

jeg fatter det ikke
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:26 #25
SQL="SELECT news.* FROM news LEFT JOIN comments ON news.id=comments.news
                                      WHERE comments.news IS NULL;"

Den virker i tidlige versioner af MySQL
Avatar billede m_sorensen Nybegynder
25. februar 2004 - 13:31 #26
Super - den virker. Du får point.
Avatar billede madschristensen Nybegynder
25. februar 2004 - 13:39 #27
Takker for point
Avatar billede jakobclausen Nybegynder
25. februar 2004 - 15:23 #28
Fik slet ingen point for at henvise til Left join *snøft* :-)
Avatar billede madschristensen Nybegynder
26. februar 2004 - 08:39 #29
Jo da - jeg deler gerne - har lige oprettet et spørgsmål - det svarer du bare på ;O)))
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
Kurser inden for grundlæggende programmering

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