Probleem onderscheiden van zelfde kolommen bij UNION SELECT query
Ik probeer met volgende query voor beide tabellen alle rijen op te halen.
De id's en titels zijn niet gerelateerd aan elkaar, daarom dat ik een UNION SELECT gebruik:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$get_nieuws_acties = mysql_query("
SELECT n.id AS nid, n.titel AS ntitel
FROM nieuws AS n
UNION
SELECT a.id AS aid, a.titel AS atitel
FROM acties AS a
");
SELECT n.id AS nid, n.titel AS ntitel
FROM nieuws AS n
UNION
SELECT a.id AS aid, a.titel AS atitel
FROM acties AS a
");
Vervolgens wil ik de resultaten van elke tabel weergeven als een lijst, met volgende code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$rows = array();
while($nieuws_actie = mysql_fetch_array($get_nieuws_acties)) {
$rows[] = $nieuws_actie;
}
foreach($rows as $nieuws) {
echo 'Nieuws ID: '.$nieuws['nid'].' - Titel: '.$nieuws['ntitel'];
}
foreach($rows as $actie) {
echo 'Actie ID: '.$actie['aid'].' - Titel: '.$actie['atitel'];
}
while($nieuws_actie = mysql_fetch_array($get_nieuws_acties)) {
$rows[] = $nieuws_actie;
}
foreach($rows as $nieuws) {
echo 'Nieuws ID: '.$nieuws['nid'].' - Titel: '.$nieuws['ntitel'];
}
foreach($rows as $actie) {
echo 'Actie ID: '.$actie['aid'].' - Titel: '.$actie['atitel'];
}
Nu is mijn probleem dat enkel de aliassen van de tabel 'nieuws' worden bewaard (nid, ntitel), en niet die van 'acties', waardoor alle resultaten, van beide tabellen, in mijn eerste lijst komen te staan. En mijn 'acties' lijst blijft leeg.
Hoe zorg ik ervoor dat beide aliassen bewaard blijven en gebruikt kunnen worden?
Bedankt.
Gewijzigd op 26/05/2012 15:06:21 door Xaboteur X
Dat is.... je moet weer even bovenaan beginnen.
Op regel 10 (van bovenstaande) code:
Doet hij het dan wel?
Daarnaast vind ik het wel raar dat je 3x die gegevens afloopt. Waarom niet in 1x en dan per categorie (acties of nieuws) in een array steken en aflopen (implode() oid)
En ik denk dat het probleem zich reeds voordoet in de query... dat die omwille van UNION enkel de aliassen pakt van de eerste SELECT, of iets dergelijks?
De bedoeling is dus om enkel te filteren met behulp van die aliassen.
Kan best zijn dat je query gewoon fout is.
Is het niet mogelijk om beide aliassen (beide tabellen), te behouden? Zodat ik nadien met php kan filteren, bijv. $result['nid'] en $result['aid'].
Ik zal het toch met één of andere omweg via JOIN's moeten doen denk ik he? Want UNION combineert de gevraagde kolommen...
Ik had ook nog deze query, maar het komt op hetzelfde neer, want ook hierin wordt een UNION gebruikt:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT n.id as nid, n.titel as ntitel
FROM nieuws as n
LEFT JOIN acties as a
ON n.id = a.id
UNION
SELECT a.id as aid, a.titel as atitel
FROM acties as a
LEFT JOIN nieuws as n
ON a.id = n.id;
FROM nieuws as n
LEFT JOIN acties as a
ON n.id = a.id
UNION
SELECT a.id as aid, a.titel as atitel
FROM acties as a
LEFT JOIN nieuws as n
ON a.id = n.id;
Iemand enig idee?
Gewijzigd op 27/05/2012 12:25:27 door Xaboteur X
Iemand?
Xaboteur X op 26/05/2012 19:03:35:
Ik krijg al mijn gevraagde records, maar hij pakt voor de kolomnamen dus alleen de twee aliassen van de eerste tabel 'nieuws' (nid, ntitel).
Ja, dat is nu eenmaal hoe een union werkt, dat kan je niet veranderen. Als je onderscheid wil maken tussen de resultaten uit de twee verschillende delen van een union zou ik een extra kolom toevoegen in de select waarbij je met verschillende waardes het onderscheid maakt. Bijvoorbeeld zo:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT n.id AS id, n.titel AS titel, 'n' AS table_type
FROM nieuws AS n
UNION
SELECT a.id, a.titel, 'a'
FROM acties AS a
FROM nieuws AS n
UNION
SELECT a.id, a.titel, 'a'
FROM acties AS a
Op het moment dat je de resultaten verwerkt kan je dan bij elk record de 'table_type' waarde checken om te weten uit welke table de rij kwam.
Simpel en kan perfect filteren nu.
Merci!