MySQL COUNT problem

Pozdrav,
radim na chatu te trebam izvući sve sobe koje posjeduju nove poruke. Pomoću COUNT dobivam broj novih poruka za svaku sobu ali on jednostavno zbroji sve nove poruke i stavi ih u zadnju sobu

$result = $smcFunc['db_query']('', "
			SELECT r.id_room, IF(r.first = {int:id_member}, r.second, r.first) AS room_member, COUNT(m.id_message) AS unread_total FROM {db_prefix}lgf_chat_rooms AS r
			LEFT JOIN {db_prefix}lgf_chat_messages AS m ON (m.id_room = r.id_room)
			WHERE (r.first = {int:id_member} OR r.second = {int:id_member}) AND (m.id_message > IF(r.first = {int:id_member}, r.first_unread, r.second_unread))",
			array(
				'id_member' => $context['user']['id'],
			)
		);

		while($row = $smcFunc['db_fetch_assoc']($result)) {
			$rooms[$row['id_room']] = array(
				'room_member' => $row['room_member'],
				'unread_messages' => $row['unread_total'],
			);
		}

polja first i second spremaju id korisnika sobe (znači 2 korisnika su maksimalno), polje first_unread sprema zadnju poruku koju je prvi korisnik pročitao, a second_unread za drugog

Trenutno je rezultat XML-a ovo:

<room id="5">
<name>Chrome</name>
<avatar></avatar>
<unread_messages>5</unread_messages>
</room>

a trebalo bi biti

<room id="2">
<name>Safari</name>
<avatar></avatar>
<unread_messages>3</unread_messages>
</room>
<room id="5">
<name>Chrome</name>
<avatar></avatar>
<unread_messages>2</unread_messages>
</room>

Svašta sam probao i jedino što mi preostaje je izvući svaku sobu i za svaku sobu pravit query ali to ne dolazi u obzir

-1-

Pa, za početak, nije mi uopće jasno kako ovaj SELECT funkcionira bez GROUP BY? U redu da je samo COUNT()… ali nisam upoznat s time da MySQL automatski implicira GROUP BY po svim ostalim poljima, ako nije eksplicitno navedeno.

Tako da će biti da se tko zna što tu dešava. Pokušaj s GROUP BY r.id_room, IF(r.first = {int:id_member}, r.second, r.first) pa se javi opet.

-2-

Druga stvar, nije jasno gdje se zapisuje tko je napisao koju poruku? Ti ovdje izdvajaš sve poruke u sobi (bez obzira tko ih je napisao) koje su novije od neke upisane kao zadnja pročitana za datog člana. Pretpostavljam da ideš s logikom da član ne može upisati poruku prije nego što pročita sve do tada upisano. Pretpostavimo da su ti brojači doista točni.

  1. Nikad nisam shvatio čemu služi GROUP BY i evo taman sam sad na stackoverflowu našo riješenje i ono je GROUP BY r.id_room
  2. Na koji način je može upisati ako prije tog ne pročita poruku? On kad otvori neku sobu updatea se zadnja pročitana poruka, u čemu je problem?

Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja