SQL query distinct voorkeur
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?
-------------------------------------------------------------
|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 | | |
-------------------------------------------------------------
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
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 -
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
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.
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