Archief - 2x username uit dezelfde tabel halen, maar verschillende waarden

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Squealer

Legacy Member
PHP:
"SELECT tt_userreacties.reactie_id, tt_userreacties.user_id AS profiel_id, 
		tt_userreacties.datum, phpbb_users.username AS profiel_name 
		FROM tt_userreacties 
		LEFT JOIN phpbb_users ON phpbb_users.user_id = tt_userreacties.user_id 
		GROUP BY tt_userreacties.user_id
		ORDER BY tt_userreacties.reactie_id DESC 
		LIMIT 0 , 10";

Dit toont o.a. de naam van de gebruiker waarop een reactie is geplaatst in zijn profiel. Ik wil echter ook nog de naam van de gebruiker die gereageerd heeft!
Daarvoor heb ik
tt_userreacties.poster_id => id van de poster (verwijst naar phpbb_users)
tt_userreacties.user_id => id van de eigenaar van het profiel (verwijst ook naar phpbb_users tabel)

Ik kan dus één van die 2 selecteren, maar ik zou niet weten hoe beiden te selecteren...

DarkBone

Legacy Member
Nog een tweede keer JOINEN met de phpbb_users tabel. In dat geval moet je dus zeker je velden voorafgaan laten gaan door een alias omdat je twee keer dezelfde tabel gebruikt. Om achteraf een onderscheid te kunnen maken zul je dus ook de geselecteerd velden die beide namen bevatten moeten hernoemen (alias opgeven).

PHP:
"SELECT tt_userreacties.reactie_id, tt_userreacties.user_id AS profiel_id, 
		tt_userreacties.datum, u1.username AS profiel_name, u2.username AS reactie_name 
		FROM tt_userreacties 
		LEFT JOIN phpbb_users u1 ON u1.user_id = 
tt_userreacties.user_id 
		LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id 
		GROUP BY tt_userreacties.user_id 
		ORDER BY tt_userreacties.reactie_id DESC 
		LIMIT 0 , 10";

Ik denk dat het dat moet zijn, vergeef me mijn eventuele foutjes :D

Squealer

Legacy Member
Hmm inderdaad, dat werkt.

Maar het probleem is nu dat hij de eerste reactie op een profiel toont, en niet de laatste....

killgore

Legacy Member
-P|b-SqUeaLeR zei:
Hmm inderdaad, dat werkt.

Maar het probleem is nu dat hij de eerste reactie op een profiel toont, en niet de laatste....

laat die order by weg en vervang dat door
WHERE
tt_userreacties.reactie_id = MAX(tt_userreacties.reactie_id)

Squealer

Legacy Member
killgore zei:
laat die order by weg en vervang dat door
WHERE
tt_userreacties.reactie_id = MAX(tt_userreacties.reactie_id)

error:

SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
GROUP BY tt_userreacties.user_id
WHERE tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id )
LIMIT 0 , 10

MySQL retourneerde:


You have an error in your SQL syntax near 'WHERE tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id ) LIMIT 0 , ' at line 1

DarkBone

Legacy Member
De WHERE-clausule komt voor de GROUP BY-clausule. Da's standaard SQL syntax ;)

Squealer

Legacy Member
DarkBone zei:
De WHERE-clausule komt voor de GROUP BY-clausule. Da's standaard SQL syntax ;)

Had ik al geprobeerd:

SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
WHERE tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id )
GROUP BY tt_userreacties.user_id
LIMIT 0 , 10

MySQL retourneerde:


Invalid use of group function

DarkBone

Legacy Member
Hmm ik had al zoiets verwacht, ik dacht dat de group functions niet konden gebruikt worden in de WHERE-clausule... heb het nagelaten om te controleren.

*edit*
Heb je geen datumveld om op te sorteren dan ? Je regelt de sorterig oplopend of aflopend door middel van ASC of DESC ... eventueel kun je daarvoor ook het ID gebruiken, alhoewel een datum veld beter geschikt is.

Squealer

Legacy Member
DarkBone zei:
Hmm ik had al zoiets verwacht, ik dacht dat de group functions niet konden gebruikt worden in de WHERE-clausule... heb het nagelaten om te controleren.

*edit*
Heb je geen datumveld om op te sorteren dan ? Je regelt de sorterig oplopend of aflopend door middel van ASC of DESC ... eventueel kun je daarvoor ook het ID gebruiken, alhoewel een datum veld beter geschikt is.

Ja ik heb een datum veld, maar als ik order by datum ipv order by reactie_id doet, geeft dat geen verschil. Het probleem zit em in die group by, hij groepeert wel de rijen, maar per groep toont hij de kleinste reactie_id, ipv de grootste...

EDIT: ff visueel voorstellen:

query1.jpg


Reactie ID 8 en 5 moet hij eruit halen...

killgore

Legacy Member
SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
WHERE (tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id ))
GROUP BY tt_userreacties.user_id
LIMIT 0 , 10

dit mssch? () kunnen wonderen doen in de wereld van mysql

DarkBone

Legacy Member
invalid use of GROUP BY functions betekend dus dat ze in dit geval op de verkeerde plaats worden gebruikt (kunnen niet in WHERE-clausule gebruikt worden).

Probeer dit eens:

SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
GROUP BY tt_userreacties.user_id
HAVING tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id )
LIMIT 0 , 10


De HAVING clausule kan wel group functions bevatten, is speciaal daarvoor in het leven geroepen.

Squealer

Legacy Member
Lol, some strange shit here :s

killgore zei:
SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
WHERE (tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id ))
GROUP BY tt_userreacties.user_id
LIMIT 0 , 10

dit mssch? () kunnen wonderen doen in de wereld van mysql

=> Invalid use of group function

DarkBone zei:
invalid use of GROUP BY functions betekend dus dat ze in dit geval op de verkeerde plaats worden gebruikt (kunnen niet in WHERE-clausule gebruikt worden).

Probeer dit eens:

SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
GROUP BY tt_userreacties.user_id
HAVING tt_userreacties.reactie_id = MAX( tt_userreacties.reactie_id )
LIMIT 0 , 10


De HAVING clausule kan wel group functions bevatten, is speciaal daarvoor in het leven geroepen.

das nog raarder:
Dit zit in de tt_userreacties tabel:
http://studweb.hogent.be/~031129sd/tt_userreacties.jpg

Uw query maakt er dit van:
http://studweb.hogent.be/~031129sd/tt_userreacties2.jpg

killgore

Legacy Member
wel, ik had probs bij het gebruiken van mysql-functies in statements als WHERE GROUP BY en ORDER BY,

probeer eens dit :s:
PHP:
SELECT tt_userreacties.reactie_id, tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id, tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name,MAX(tt_userreacties.reactie_id) AS tot
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
WHERE tt_userreacties.reactie_id = tot
GROUP BY tt_userreacties.user_id
LIMIT 0 , 10

Squealer

Legacy Member
Unknown column 'tot' in 'where clause'

Ben aant opgeven, kzal dan toch moeten overwegen een "laatstereactie" veld bij te houden

Squealer

Legacy Member
Keb et dan maar zo opgelost:

2 query's:

PHP:
$string = "";
$blah = mysql_query("
SELECT MAX(reactie_id) AS maxreact
FROM tt_userreacties
GROUP BY user_id ORDER BY reactie DESC LIMIT 0,10
");
while($blahblah = mysql_fetch_array($blah)) {
$string .= "tt_userreacties.reactie_id = ".$blahblah['maxreact']." OR ";
}
$string = substr($string,0,-4);

PHP:
$SQL_posts = "
SELECT tt_userreacties.poster_id AS poster_id, tt_userreacties.user_id AS profiel_id,
tt_userreacties.datum, u1.username AS profiel_name, u2.username AS poster_name
FROM tt_userreacties
LEFT JOIN phpbb_users u1 ON u1.user_id = tt_userreacties.user_id
LEFT JOIN phpbb_users u2 ON u2.user_id = tt_userreacties.poster_id
WHERE ".$string."
ORDER BY tt_userreacties.reactie_id DESC
";

Khoop dat het niet teveel vertraagd :s
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan