Probleem onderscheiden van zelfde kolommen bij UNION SELECT query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xaboteur X

Xaboteur X

26/05/2012 15:05:33
Quote Anchor link
Hallo allemaal,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
");


Vervolgens wil ik de resultaten van elke tabel weergeven als een lijst, met volgende code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'];
}


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
 
PHP hulp

PHP hulp

29/03/2024 03:30:17
 
Eddy E

Eddy E

26/05/2012 16:52:53
Quote Anchor link
Dat komt omdat $rows wordt afgelopen blijft de pointer dus aan het einde staan.
Dat is.... je moet weer even bovenaan beginnen.

Op regel 10 (van bovenstaande) code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
reset($rows);


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)
 
Xaboteur X

Xaboteur X

26/05/2012 17:46:25
Quote Anchor link
Bedankt Eddy, maar reset($rows) haalt niks uit.
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.
 
Eddy E

Eddy E

26/05/2012 18:23:53
Quote Anchor link
Heb je iets van phpMyAdmin? Wat geeft die query daar?
Kan best zijn dat je query gewoon fout is.
 
Xaboteur X

Xaboteur X

26/05/2012 19:03:35
Quote Anchor link
Ik krijg al mijn gevraagde records, maar hij pakt voor de kolomnamen dus alleen de twee aliassen van de eerste tabel 'nieuws' (nid, ntitel).

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;


Iemand enig idee?
Gewijzigd op 27/05/2012 12:25:27 door Xaboteur X
 
Xaboteur X

Xaboteur X

29/05/2012 16:15:57
Quote Anchor link
Iemand?
 
Erwin H

Erwin H

29/05/2012 17:42:28
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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

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.
 
Xaboteur X

Xaboteur X

29/05/2012 20:49:06
Quote Anchor link
Hey Erwin, heel erg bedankt!
Simpel en kan perfect filteren nu.
Merci!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.