2016-08-15 2 views
0

So sind meine Tabellen zu zeigen:
user_msgs: http://sqlfiddle.com/#!9/7d6a9
token_msgs: http://sqlfiddle.com/#!9/3ac0ferstellen GROUP BY-Abfrage die letzte Zeile

Es gibt nur diese 4 Benutzer als aufgeführt. Wenn ein Benutzer eine Nachricht an einen anderen Benutzer sendet, prüft die Abfrage, ob eine Kommunikation zwischen diesen beiden bereits gestarteten Benutzern besteht, indem die Tabellen from_id und to_id überprüft werden. Wenn kein Token vorhanden ist, erstellen Sie token und verwenden Sie diesen in der Tabelle user_msgs. Das Token ist also ein eindeutiges Feld in diesen 2 Tabellen.

Jetzt möchte ich die Benutzer auflisten, mit denen user1 die Konversation gestartet hat. Wenn also from_id oder to_id1 enthalten, sollten diese Konversationen aufgelistet werden.

Es gibt mehrere Zeilen für Konversationen in der Tabelle user_msgs für dieselben Benutzer.

Ich denke, ich muss group_concat verwenden, aber nicht sicher. Ich versuche, die Abfrage zu erstellen, das gleiche zu tun, und die neuesten des Gesprächs auf der Oberseite zeigen, daher ORDER BY time DESC:

SELECT * FROM (SELECT * FROM user_msgs ORDER BY time DESC) as temp_messages GROUP BY token 

Bitte helfen Sie die Abfrage im Aufbau.

enter image description here

Dank.

CREATE TABLE `token_msgs` (
    `id` int(11) NOT NULL, 
    `from_id` int(100) NOT NULL, 
    `to_id` int(100) NOT NULL, 
    `token` varchar(50) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `token_msgs` 
-- 

INSERT INTO `token_msgs` (`id`, `from_id`, `to_id`, `token`) VALUES 
(1, 1, 2, '1omcda84om2'), 
(2, 1, 3, '1omd0666om3'), 
(3, 4, 1, '4om6713bom1'), 
(4, 3, 4, '3om0e1abom4'); 


--- 


CREATE TABLE `user_msgs` (
    `id` int(11) NOT NULL, 
    `token` varchar(50) NOT NULL, 
    `from_id` int(50) NOT NULL, 
    `to_id` int(50) NOT NULL, 
    `message` text NOT NULL, 
    `time` datetime NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `user_msgs` 
-- 

INSERT INTO `user_msgs` (`id`, `token`, `from_id`, `to_id`, `message`, `time`) VALUES 
(1, '1omcda84om2', 1, 2, '1 => 2\r\nCan I have your picture so I can show Santa what I want for Christmas?', '2016-08-14 22:50:34'), 
(2, '1omcda84om2', 2, 1, 'Makeup tip: You\'re not in the circus.\r\n2=>1', '2016-08-14 22:51:26'), 
(3, '1omd0666om3', 1, 3, 'Behind every fat woman there is a beautiful woman. No seriously, your in the way. 1=>3', '2016-08-14 22:52:08'), 
(4, '1omd0666om3', 3, 1, 'Me: Siri, why am I alone? Siri: *opens front facing camera*', '2016-08-14 22:53:24'), 
(5, '1omcda84om2', 1, 2, 'I know milk does a body good, but damn girl, how much have you been drinking? 1 => 2', '2016-08-14 22:54:36'), 
(6, '4om6713bom1', 4, 1, 'Hi, Im interested in your profile. Please send your contact number and I will call you.', '2016-08-15 00:18:11'), 
(7, '3om0e1abom4', 3, 4, 'Girl you\'re like a car accident, cause I just can\'t look away. 3=>4', '2016-08-15 00:42:57'), 
(8, '3om0e1abom4', 3, 4, 'Hola!! \r\n3=>4', '2016-08-15 00:43:34'), 
(9, '1omd0666om3', 3, 1, 'Sometext from 3=>1', '2016-08-15 13:53:54'), 
(10, '3om0e1abom4', 3, 4, 'More from 3->4', '2016-08-15 13:54:46'); 
+0

Put DDL/DML in Frage selbst. Link nicht zu externen Websites – hjpotter92

+1

Bitte aktualisieren Sie die Frage mit erwartetem Ergebnis als Text und kennzeichnen Sie auch relevante RDBMS (nicht sowohl SQLServer und MYSQL), wenn Sie möchten, dass Ihre Abfrage auf beiden Versionen funktioniert, bitte geben Sie – TheGameiswar

+0

@TheGameiswar getan – Somename

Antwort

1

ist dies Lassen Sie versuchen (auf fiddle):

SELECT * 
FROM (SELECT * FROM user_msgs 
    WHERE from_id = 1 OR to_id = 1 
    ORDER BY id DESC 
) main 
GROUP BY from_id + to_id 
ORDER BY id DESC 

Thing GROUP BY from_id + to_id zu erwähnen, ist dies, weil Summe für jedes Gespräch zwischen zwei Personen, die sie einzigartig macht: wie von 1 bis 3 ist die gleiche wie von 3 Keine Notwendigkeit für zusätzliche Tabelle 1, und es macht es schwieriger

UPDATE zu halten:

Denn manchmal GROUP ing seltsam in MySQL funktioniert Ich habe für dieses Problem neuen Ansatz geschaffen:

SELECT 
    a.* 
FROM user_msgs a 
LEFT JOIN user_msgs b 
    ON ((b.`from_id` = a.`from_id` AND b.`to_id` = a.`to_id`) 
     OR (b.`from_id` = a.`to_id` AND b.`to_id` = a.`from_id`)) 
    AND a.`id` < b.`id` 
WHERE (a.from_id = 1 OR a.to_id = 1) 
    AND b.`id` IS NULL 
ORDER BY a.id DESC 
+0

Es funktioniert in der Geige, aber nicht lokal. Im trin in der Konsole von phpMyAdmin und mit php auch .. was könnte das Problem sein? Bitte helfen Sie. Derjenige, der in der Geige arbeitet, ist genau das, was ich will. http://imgur.com/a/7gWQQ Was mache ich falsch? Bitte helfen Sie. – Somename

+0

Mit Blick auf meine Ergebnisse ist klar, dass es die allererste Konversation zwischen den 2 Benutzern und mit Ihrer Abfrage die letzte Aufnahme, was ich will. – Somename

+0

sind deine Daten groß? Hast du Indizes? Was ist der Fehler? –