Групиране на резултат от SQL

metal_head

Registered
Така, първо да покажа таблицата, която имам:

Казва се pm и има следните колони:

id | sender | receiver | message | title | timestamp | isread

Това е таблица за лични съобщения. Аз обаче искам да показвам личните съобщения в сайта в стил фейсбук - тоест да има списък с потребителите, с които някога съм си говорил и вече когато кликна на дадения потребител, да излиза разговора. Това добре, направих го, но имам един проблем със самото показване на въпросния списък. Какво ли не правих, все не се получава. Понеже имам поле sender и receiver, ето как е заявката ми:

[sql]SELECT * FROM pm WHERE receiver='$user_id' OR sender='$user_id' GROUP BY receiver[/sql]

Това е ОК, работи в 70% от случаите, но вижте, ако някой ми напише съобщение и аз не съм отговорил (тоест нямаме никакви записи с този потребител в колоната receiver), то той няма да го има в списъка.

Ок, тогава ще направя така:
[sql]SELECT * FROM pm WHERE receiver='$user_id' OR sender='$user_id' GROUP BY sender[/sql]

Сега обаче ще ми покаже само потребителите, които са ми писали. Ако аз съм писал на някой и той не ми е отговорил, няма да ми го покаже.

Ако групирам GROUP BY sender, receiver пък ще имам дубликиращи се записи с тези, на които съм писал и те са ми писали. Същото ще се получи и ако имам две заявки.

Някой има ли идея как ще стане това при този дизайн на таблицата или ще трябва да се преправя таблицата?
 
По стандарт групирането трябва да бъде направено по всички параметри, които показваш в селекта. mySQL е единствения сървър, койта аз съм виждал да не дава грешка когато не правиш групирането правилно. На практика ако искаш да групираш по дадено поле или полета трябва да покажеш само това поле, а всичко останало, което показваш да е в агрегатни функции. Можеш ли да дадеш пример с няколко реда от таблицата ти и да покажеш отделно какво искаш да ти върне заявката?
 
Сериозно? По всички колони? Интересно, в училище явно са ни научили гьотере (а е училище за компютри...).

Ето няколко реда:


id | sender | receiver | message |
1 | 1 | 2 | как си?
2 | 2 | 1 | добре!
3 | 1 | 4 | к'во става?
4 | 4 | 1 | нищо

Така, сега:
В ред 1 и 2 потребители 1 и 2 си говорят.
Потребител 1 пита 2 как е, после потребител 2 отговаря "добре".
При това положение с моята заявка на потребител 1 ще му се покаже, че има разговор с потребител 2, щото групираме по receiver. На потребител 2 обаче няма да му се покаже разговора, докато не отиде в "непрочетени" и не отговори от там - тогава разговорът ще се покаже и за него, защото той е изпратил съобщение към 1, където той е receiver.

Същото е и с потребители 1 и 4.

Това, което искам е всеки потребител да вижда списък на потребителите, с които си е говорил или които са му пратили съобщение, без значение дали той е отговорил.
 
Като казваш какво искаш по-добре дай резултантната таблица, която ти трябва да излезе от селекта, защото пак не съм много сигурен дали съм те разбрал много добре, но примерно нещо такова:

mysql_query("select distinct CASE WHEN sender=$currentuser THEN receiver ELSE sender END as Partner from table where sender=$currentuser or receiver=$currentuser");
 
ОК, ето какво всеки потребител трябва да получи:

Потребител 1 ще получи 2 резултата: последният от редовете, (тоест ред 2) в който си е говорил с потребител 2 и последният, в който си е говорил с 4, тъй като и в 4-те реда този потребител е, или подател или получател. Получава 2 реда, защото системата му ги групира, за да може да ги вижда като разговори:

Разговор с потребител 2
Разговор с потребител 4

Потребители 2 и 4 ще имат 1 ред, защото са си говорили само с 1 потребител и той е 1:

Разговор с потребител 1.

Кодът, който ми даде дава грешка 1064 за синтакс.
Аз не съм толкова запознат с тези неща все още и не разбрах това какво прави: [sql]AS PARTNER FROM TABLE[/sql]
 
В $currentuser трябва да сложиш текущия потребител

Това е едно цяло:
CASE WHEN sender=$currentuser THEN receiver ELSE sender END as Partner,
което обединява в едно поле другия участник в разговора.
 
В $currentuser трябва да сложиш текущия потребител

Е, естествено. Само че аз пробвах заявката в mysql-а даже и ми дръща грешка:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table where sender='1' or receiver='1'' at line 1


Ами така няма ли да се получи?

[sql]SELECT DISTINCT IF sender='1' THEN receiver ELSE sender END IF; FROM pm WHERE sender='1' OR receiver='1'[/sql]
Пак ми дава грешка де...
 
Да, и това съм заместил, просто понеже исках да ти копирам грешката и специално го пуснах в SQL-а съм забравил в случая да го сменя. Виж горния ми пост -редактирал съм го. Интересно ми е по този начин дали ще стане - с IF.
 
[sql]CREATE TABLE `pm` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sender` varchar(40) NOT NULL,
`receiver` varchar(40) NOT NULL,
`timestamp` int(11) NOT NULL,
`message` text NOT NULL,
`isread` tinyint(1) NOT NULL,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=50 ;[/sql]
 
Айде намери какво не си преписал добре защото при мен минава:

test.jpg
 
Когато го преписах от скрийншота ти се получи, но като го копирах и промених данните, въпреки че видях - изглеждаше по същия начин стринга - не работеше.
Благодаря ти за отделеното време, в момента работи! :)
 

Back
Горе