SQL query distinct voorkeur
Hey, Heren.
ik probeer een query te schrijven wat alle rijen uit een tabel haalt waar een kolom uniek is maar er word gekeken naar een andere column als voorkeur.
dus bijvoorbeeld ik heb 4 rijen waar 1 daarvan niet uniek is maar de taal engels heeft.
de bedoeling is als ik alle kolomen ophaal dat ik dan alle Engelse kolomen krijg maar zodra die niet bestaat hij de zelfde rij pakt in een andere taal opgegeven taal.
iemand enig idee hoe ik dit voor elkaar krijg?
ik probeer een query te schrijven wat alle rijen uit een tabel haalt waar een kolom uniek is maar er word gekeken naar een andere column als voorkeur.
dus bijvoorbeeld ik heb 4 rijen waar 1 daarvan niet uniek is maar de taal engels heeft.
de bedoeling is als ik alle kolomen ophaal dat ik dan alle Engelse kolomen krijg maar zodra die niet bestaat hij de zelfde rij pakt in een andere taal opgegeven taal.
iemand enig idee hoe ik dit voor elkaar krijg?
Ja dat kan zeer zeker, maar je vraagstelling is erg abstract. Kun je een beschrijving van je tabel geven en een voorbeeld van wat je als output verwacht?
invoer:
-------------------------------------------------------------
|1 | title | nl | | |
-------------------------------------------------------------
|2 | title | nl | | |
-------------------------------------------------------------
|3 | title | nl | | |
-------------------------------------------------------------
|3 | title | en | | |
-------------------------------------------------------------
|4 | title | nl | | |
-------------------------------------------------------------
|4 | title | be | | |
-------------------------------------------------------------
Wat ik nodig heb als ik het liefst de taal EN wil maar de standaard taal is NL:
-------------------------------------------------------------
|1 | title | nl | | |
-------------------------------------------------------------
|2 | title | nl | | |
-------------------------------------------------------------
|3 | title | en | | |
-------------------------------------------------------------
|4 | title | nl | | |
-------------------------------------------------------------
-------------------------------------------------------------
|1 | title | nl | | |
-------------------------------------------------------------
|2 | title | nl | | |
-------------------------------------------------------------
|3 | title | nl | | |
-------------------------------------------------------------
|3 | title | en | | |
-------------------------------------------------------------
|4 | title | nl | | |
-------------------------------------------------------------
|4 | title | be | | |
-------------------------------------------------------------
Wat ik nodig heb als ik het liefst de taal EN wil maar de standaard taal is NL:
-------------------------------------------------------------
|1 | title | nl | | |
-------------------------------------------------------------
|2 | title | nl | | |
-------------------------------------------------------------
|3 | title | en | | |
-------------------------------------------------------------
|4 | title | nl | | |
-------------------------------------------------------------
Je zou het met order by kunnen doen zat ik te denken maar dan moet 'nl' misschien '_nl' worden zodat deze bovenin komt te staan in de alfabetische volgorde...
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$t = 'en';
$id = 2;
$qry = "SELECT * FROM tabelnaam WHERE id=$id AND (taal='$t' OR taal='nl') ORDER BY '$t'";
?>
$t = 'en';
$id = 2;
$qry = "SELECT * FROM tabelnaam WHERE id=$id AND (taal='$t' OR taal='nl') ORDER BY '$t'";
?>
Gewijzigd op 01/11/2012 15:03:21 door Frank Nietbelangrijk
dat is totaal niet wat ik bedoel.
ik heb unieke rijen nodig waar bij een voorkeur taal is aangegeven en als die niet bestaat terug valt op de standaard taal.
ik heb unieke rijen nodig waar bij een voorkeur taal is aangegeven en als die niet bestaat terug valt op de standaard taal.
Gewijzigd op 01/11/2012 14:55:06 door TNG -
Ik neem aan dat die id's uit een andere tabel komen?
Dan kan je met een LEFT JOIN en COALESCE dat bereiken:
met COALESCE wordt en.title geslecteerd als deze niet leeg is, anders nl.title
Dan kan je met een LEFT JOIN en COALESCE dat bereiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
i.item_date,
COALESCE(en.title, nl.title) AS title
FROM
items AS i
LEFT JOIN
details AS en
ON
i.item_id = en.item_id
AND
en.lang_id = 'en'
LEFT JOIN
details AS nl
ON
i.item_id = nl.item_id
AND
nl.lang_id = 'nl'
WHERE
i.item_date => CURRENT_DATE()
i.item_date,
COALESCE(en.title, nl.title) AS title
FROM
items AS i
LEFT JOIN
details AS en
ON
i.item_id = en.item_id
AND
en.lang_id = 'en'
LEFT JOIN
details AS nl
ON
i.item_id = nl.item_id
AND
nl.lang_id = 'nl'
WHERE
i.item_date => CURRENT_DATE()
met COALESCE wordt en.title geslecteerd als deze niet leeg is, anders nl.title
Gewijzigd op 01/11/2012 15:21:58 door Ger van Steenderen
Hey ger,
dit is inderdaad de goede richting op, maar er wordt nog wat meer info bij iedere rij opgeslagen.
dus ik heb niet alleen de title nodig maar eigenlijk de hele rij.
dit is inderdaad de goede richting op, maar er wordt nog wat meer info bij iedere rij opgeslagen.
dus ik heb niet alleen de title nodig maar eigenlijk de hele rij.
Is de gehele rij taal afhankelijk? Je kunt die COALESCE op elke kolom toepassen.
Ik weet het lijkt omslachtig, maar het is eigenlijk op de manier zoals het nu is, de enige nog redelijk simpele oplossing.
Ik weet het lijkt omslachtig, maar het is eigenlijk op de manier zoals het nu is, de enige nog redelijk simpele oplossing.
Edit:
Ik denk nog steeds sneller dan dat ik type (gelukkig maar, want dat gaat niet zo snel)
Ik denk nog steeds sneller dan dat ik type (gelukkig maar, want dat gaat niet zo snel)
Gewijzigd op 01/11/2012 15:49:56 door Ger van Steenderen




