dubbel select sql 1 tabel

Status
Niet open voor verdere reacties.

migthy84

Gebruiker
Lid geworden
13 okt 2009
Berichten
580
hi

kan iemand me helpen op dit moment heb ik een tabel

nieuws
------------------------------------------------------------------------------------------------------------------------------
id |aangemaakt door | aanmaakdatum | gewijzigd| wijzigingsdatum| producten informatie
------------------------------------------------------------------------------------------------------------------------------

nu wil in de view alleen zijn door wie het nieuws als aangemaakt is.

Het probleem is echter dat wanneer er een nieuwe nieuwsitem is er geen wijzigingsdatum is omdat moment dien ik aanmaakdatum te select teren. Graag wil ik dit 1 SQL uit voeren.

Normaliter kan dit vraagstuk oplossen door 2 select statements te gebruiken. Eentje die bekijkt of wijzigingsdatum is in invuld is zo.
 
Je wil de wijzigingsdatum als die is ingevuld, en anders de aanmaakdatum, als ik het goed begrijp?

Probeer dit eens:
[sql]
SELECT IF( wijzigingsdatum, wijzigingsdatum, aanmaakdatum )
FROM tabel
[/sql]
 
inderdaad hmm werkt wel bij een integer en niet datum tijd.

Vroeger deed je zulk soort dingen door een extra select statement in de select neer te zetten

Select wijzingsdatum , aanmaakdatum
from tabel
where (select wijzingsdatum <>null )

iets in die trandt , ben even het goede select statement vergeten

Het is inmiddels gevonden. Werkt select if ook met berekeningen
 
Laatst bewerkt:
Wat is de standaard value van wijzigingsdatum?

Je kunt de IF uitbreiden met die, om te controleren. Ik ging uit van een timestamp en die zijn standaard 0, maar als het wat anders is dan moet je daar tegen matchen:

(Voorbeeld, tussen de ' ' moet dus de standaard waarde van wijzigings datum)
[sql]
SELECT IF( wijzigingsdatum = '0000:00:00', wijzigingsdatum, aanmaakdatum )
FROM tabel
[/sql]
 
Ik heb inderdaad op een andere manier aangepast.

ik hoop dat je er ook bereiking mee kan doen. zoals < kleiner dan. Dit gaat me in de toekomst veel winst uitmaken
 
Ja je kunt bewerkingen doen in de IF, SQL ondersteunt heel erg veel :)
 
Iets als

Optie 1
Select Case Wijzigingsdatum When '00:00:00' Then 'Aangemaakt door' else 'gewijzigd' End
From Nieuws

Of
Optie 2

Select [aangemaakt door] as User
From Nieuws
Where wijzigingsdatum = '00:00:00'
Union all
Select [gewijzigd] as User
From Nieuws
Where wijzigingsdatum <> '00:00:00'
 
ik heb op dit moment 3 tabellen

artikel , koppel artikel en schrijvers

artikel bestaat uit
id, naam,inhoudt , omschrijving , koppeld id

Koppelartikel staat voor
id, schrijverid

Schrijver bestaat uit :

schrijverid , naam ,functie

nu wil ik met 1 sql alle artikel ophalen met het aantaal schrijvers.

Select a.naam,a.inhoud, a,omschrijviing ,count(aantal(select * from koppelartike a ,koppelartikel kaa where a.id = kaa.id)) from artikel a , koppelartikel ka , schrijverid)

wat gaat er fout
 
Je probeert een COUNT te doen over meerdere kolommen, dat kan niet. Er moet 1 kolom in:

[sql]
SELECT COUNT( veld )
FROM tabel
WHERE conditie = 'waar'
[/sql]

Dit is niet toegestaan:
[sql]
SELECT COUNT( veld, ander_veld )
FROM tabel
WHERE conditie = 'waar'
[/sql]


Probeer het eens zo:

[sql]
SELECT a.naam, a.inhoud, a.omschrijviing , COUNT ( 1 )
FROM artikel a
INNER JOIN koppelartikel k ON k.artikelid = a.id
GROUP BY a.id
[/sql]

Ik ga er vanuit dat koppelartikel ook een artikelid heeft, anders is het een beetje een nutteloze tabel ;)
 
de koppelarttikel is een tabel met een dubbel primary key het word dus echt gebruikt als koppel tabel.

Het wast idd beter uitgeschreven

artikelid, schrijverid ik ga het proberen hoop dat het met een innerjoin lukt.

inprincipe gebruik ik ook maar 1 count .

Code:
Select a.naam, a.inhoud a.omschrijving, count(ka.schrijverid) as aantaal
From artikel a , koppelartikel ka , schrijvers s,
Where  a.koppelid = ka.id

Het probleem is dat hij nu 2 keer alles op tel omdat ik de tabel artikel 2 keer deze koppelid heb. Artikel a en b hebben immers de zelfde schrijver.

--------------------------------------------------------

tabel : artikel

1, Testdocument, dit is een testdocument tername van de infra........,infrastructuur ,1
2, Testsettinggs, dit is een proefdocument, proefdocument ,1

tabel: koppelartikel
1,1
1,2
1,3

tabel schrijver

1, Peter Jansen , nawgegevens
2, Piet Mijhof , nawgegevens
3,Cris Moij, nawgegevnes

de uitkomst die ik wil hebben

Regel 1: Testdocument, dit is een testdocument tername van de infra........,infrastructuur 3
Regel 2: Testsettinggs, dit is een proefdocument, proefdocument ,3
 
Laatst bewerkt:
het is opgelost . door een group by en distinct count

Code:
Select a.naam , a.inhoudt , a.omschrijving , distinct count (ka.schrijversid)
from artikel a , koppelartikel ka
where ka.id = a.koppelid
group by a.id;

Het is me alleen niet duidelijk waarom distinct voor count moet. Inprincipe tel je rijen al 1 voor 1 en doe je mag je niet geen rij dubbel tellen.

Echter geeft mysql niet altijd de waarde terug die ik wilde zonder distinct.
 
[sql]
Select a.naam, a.inhoud a.omschrijving, count(ka.schrijverid) as aantaal
From artikel a , koppelartikel ka , schrijvers s,
Where a.koppelid = ka.id
[/sql]

Dit genereert een carthesisch product omdat schrijvers niet gejoined is op een andere kolom. Hij zal nu elke mogelijke schrijver aan elk artikel koppelen, omdat nergens aangegeven wordt wat de relatie tussen de twee is. Als je die tabel simpelweg niet meeneemt zou het goed moeten gaan.

COUNT DISTINCT telt alle unieke waarden. Dus als je de volgende rijen hebt:

1
1
2
3

Dan levert een COUNT() daarop 4 op (er zijn 4 rijen) en een COUNT DISTINCT() levert 3 (er zijn 3 unieke waarden in de reeks)
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan