PDA

Volledige versie bekijken : 2x username uit dezelfde tabel halen, maar verschillende waarden



Squealer
28 april 2004, 11:27
"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
28 april 2004, 11:46
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).



"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
28 april 2004, 14:39
Hmm inderdaad, dat werkt.

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

killgore
28 april 2004, 15:05
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
28 april 2004, 15:18
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
28 april 2004, 15:40
De WHERE-clausule komt voor de GROUP BY-clausule. Da's standaard SQL syntax ;)

Squealer
28 april 2004, 15:44
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
28 april 2004, 15:48
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
28 april 2004, 15:55
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:

http://studweb.hogent.be/~031129sd/query1.jpg

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

Squealer
28 april 2004, 23:03
anyone plz :sad:

killgore
28 april 2004, 23:42
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
29 april 2004, 00:00
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
29 april 2004, 11:34
Lol, some strange shit here :s


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


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
30 april 2004, 20:17
wel, ik had probs bij het gebruiken van mysql-functies in statements als WHERE GROUP BY en ORDER BY,

probeer eens dit :s:


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
30 april 2004, 20:42
Unknown column 'tot' in 'where clause'

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

Squealer
30 april 2004, 21:02
Keb et dan maar zo opgelost:

2 query's:


$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);


$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