[sql] singleline select

Pagina: 1
Acties:

  • LightYears
  • Registratie: September 2000
  • Laatst online: 14-03-2024

LightYears

wilt geen iPod

Topicstarter
ik heb een, voor mij, groot probleem met een sql statement, het volgende speelt zich af

Ik heb een database met 1 tabel, in die tabel staan alle nummers die ik op me hardeschijf of op cd heb staan.
het verschil tussen hd en cd zie ik d.m.v het cdid, dit is voor de hardeschijf 0 en voor cd's alles boven 0

nu wil ik een select querie bouwen die het verschil tussen enerzijds de hd en anderzijds de cd's laat zien, zo kan ik in 1 oogopslag zien welke mp3's ik nog niet heb weggebrandt.

Ik werk met mysql, dus een subselect kan ik niet gebruiken. Nu heb ik mijn hoofd al 2 dagen gebroken over dit probleem maar ik heb nog steeds geen oplossing gevonden.

ik denk aan
code:
1
select distict * from cd where cdid = 0 not in (select * form cd where cdid != 0)

ik weet niet eens of dit me het gewenste eindresultaat geeft, maar ik kan het niet eens testen :(
Iemand wel een idee?

EAC > Ogg vorbis -q6 > Cowon S9 > Westone ES3X > Oor


  • LightYears
  • Registratie: September 2000
  • Laatst online: 14-03-2024

LightYears

wilt geen iPod

Topicstarter
Hmm die sql statement is zowiezo fout zie ik nu ...
code:
1
select distict * from cd where cdid = 0 not in (select * form cd where cdid != 0)

dit leverd natuurlijk altijd cd 0 op. Dus ik weet niet eens wat de goede statement is :( had toch beter moeten opletten bij de sql klasjes ...

EAC > Ogg vorbis -q6 > Cowon S9 > Westone ES3X > Oor


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Misschien dat functies als INTERSECT je nog kunnen helpen?

Er zijn er een paar van, UNION (niet bruikbaar in dit geval), INTERSECT en nog een paar. Zoek er even op in de mysql manual :)

[edit]
Je zegt dat je mysql gebruikt en dus geen subselects mag doen, waarom maak je dan een query met een subselect? ;)

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Je databasestructuur zou hier handig bij zijn (relevante tabellen only, of course)

ik neem aan:
cd(cdid,...)

je wilt alle cd's selecteren die je nog niet hebt weggebrand?
code:
1
2
3
SELECT *
FROM cd
WHERE cdid=0

je wilt alle cd's selecteren die je al wel hebt weggebrand?
code:
1
2
3
SELECT *
FROM cd
WHERE cdid!=0

Die query die je hier geeft is een beetje onzin.
(selecteer alle cd's waarvan cdid=0, en die niet voorkomen in de lijst waar cdid!=0)


Misschien als je duidelijk uitlegt wat je wilt, is dat makkelijker...

Localhost, sweet localhost


  • LightYears
  • Registratie: September 2000
  • Laatst online: 14-03-2024

LightYears

wilt geen iPod

Topicstarter
als voorbeeld van wat het zou moeten doen
met een goede subselect statement is het vertalen naar een niet subselect iets makkelijker als dat je helemaal van voor af an moet beginnen, maar ik zal eens kijken of INTERSECT iets voor me kan betekenen.

EAC > Ogg vorbis -q6 > Cowon S9 > Westone ES3X > Oor


  • LightYears
  • Registratie: September 2000
  • Laatst online: 14-03-2024

LightYears

wilt geen iPod

Topicstarter
In de tabel CD staat het volgende
[cdid|artist|album|track|title|filesiez]

de tabel is gevult met op cdid 0 de inhoud van me hardeschijf (alles wat ik heb)
op cdid > 0 staan de verschillende cd's

de nummers op cdid 0 kunnen voorkomen op 1 van de cd's (cdid > 0)

Ik probeer uit te vinden hoe ik die nummers kan selecteren die wél op cdid 0 staan maar niet voorkomen op cdid > 0.

edit:

van de mysql docs: uit "things that need to be done sometime"[quote]
MINUS, INTERSECT and FULL OUTER JOIN. (Currently UNION (in 4.0) and LEFT OUTER JOIN are supported)
[/quote]

Intersect valt dus af

EAC > Ogg vorbis -q6 > Cowon S9 > Westone ES3X > Oor


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Hmm .. ik ruik hier een minder goet db model... Beetje veel redundante gegevens.

Mischien had je beter het cdid gedeelte los kunnen koppelen. Als ik het goed begrijp staan mp3's nu meerdere keren in je tabel waneer ze op meerdere cd's (of hardeschijf) staan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dit kun je met een truukje oplossen:
Gebruik een outer join om de tabel met zichzelf te joinen.
Selecteer bij de eerste je hd nummers en bij de tweede de cd nummers.
En dan nu de magische truuk: voeg toe: waar cd nummer is null.

Who is John Galt?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Als je een fatsoenlijk db-model had ( :) ) kon je zoiets doen:
code:
1
2
3
4
5
6
7
8
SELECT 
  nummerID 
FROM 
  cd_locatie 
WHERE 
  MIN(cdid)=0 AND COUNT(cdid)=1 
GROUP BY 
  nummerID;

Dit valt dan ook wel weer te joinen met de tabel waar de werkelijke titels en andere gegevens van de nummers in staat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1