2017-05-30 1 views
1

Tabelle Group_UsersFilter sql Datensätze zu mehreren Zeiträumen in codeigniter und mysql?

id | user_id | join_time   | left_time 
----------------------------------------------- 
1 | 123  | 2017-05-29 15:26:00 | 2017-05-29 17:26:00 
2 | 123  | 2017-05-29 19:00:00 | 2017-05-29 21:00:00 
3 | 123  | 2017-05-29 21:30:00 | NULL 

Tabelle Group_Message

id | Message | sender_id | message_time 
1 | Hii  | 456  | 2017-05-29 15:30:00   
2 | tes  | 123  | 2017-05-29 18:30:00   
3 | why  | 852  | 2017-05-29 22:30:00 
  • i haben Funktionen wie Gruppennachricht. wo der Benutzer Gruppe verlassen oder beitreten kann.

  • Wann immer er ging oder Gruppe beitreten seine activity in Group_Users Tabelle gespeichert.

  • und wenn der Benutzer eine Nachricht sendet, wird sie in Group_Message mit der Zeit gespeichert.

  • Ich habe andere Feld wie group_id, aber ich habe es hier für Einfachheit entfernt.

  • Ich möchte, wenn Benutzer beitreten der Gruppe zu diesem Zeitpunkt zeigen ihm nur Nachrichten während seiner verbundenen Zeit.

  • z. Wenn der Benutzer 123 zu dieser Zeit der Gruppe beitritt, sieht er nur Nachrichten 1,3.

  • zum Zeitpunkt 2 Nachricht er ist nicht Mitglied der Gruppe.

Das ist meine alte Abfrage, die ich vor verwenden, wenn Benutzer kann er nicht wieder zusammenzubringen und nach links Gruppe alte Nachrichten sehen

$this->db->select('gm.*'); 
$this->db->from('group_message gm'); 
$this->db->where('gm.group_id',$id); 

$this->db->where('gm.id NOT IN (select message_id from  delete_group_message where user_id = '.$user_id.')',NULL,FALSE); 

$this->db->where('gm.time >= (select join_time from group_users where user_id = '.$user_id.')',NULL,FALSE); 

$this->db->where('gm.time <= (select left_time from group_users where user_id = '.$user_id.')',NULL,FALSE); 
    $this->db->order_by('time','DESC'); 
    $query = $this->db->get(); 
    $res = $query->result_array(); 
+0

Warum eine Verbindung zwischen den beiden Tabellen nicht basierend auf message_time zwischen join_time und left_time (mit einer ifnull Funktion auf left_time bis jetzt())? –

+1

@SloanThrasher Vielen Dank für Ihr Interesse, aber ich habe Funktionalität, wo Yser kann verlassen und sich mehrere Zeit, so dass wir mehrere Benutzerperioden haben und zeigen ihm keine Nachrichten, wenn Hi nicht Teil der Gruppe ist. zB hier können wir sehen, dass Benutzer nicht Teil der Gruppe zwischen 2017-05-29 17:26:00 bis 2017-05-29 19:00:00 und 2017-05-29 21:00:00 bis 2017-05-29 ist 21:30:00. Daher müssen wir keine Nachrichten anzeigen, die während dieser Zeit gesendet wurden. –

+0

Genau/Das ist, was ein Join tun würde. –

Antwort

0

Sie haben nicht Datenbank Sie notieced verwende ich, also habe ich Weg für SQL Server zur Verfügung gestellt. Idee ist, Tabellen zu verbinden und WHERE Klausel zu verwenden, um zu überprüfen, ob message_time zwischen join_time und left_time ist. Überprüfen Sie später, ob left_timeNULL ist, dh der Benutzer ist immer noch verbunden, so dass Sie COALESCE verwenden können, um NULL in die aktuelle Zeit zu konvertieren.

SELECT m.Id, m.Message 
FROM users AS u 
JOIN messages AS m ON u.Id = m.Id 
WHERE m.message_time BETWEEN u.join_time AND COALESCE(u.left_time, GETDATE()) 

Für MySQL können Sie NOW() statt GETDATE() verwenden.

+0

Vielen Dank für Ihr Interesse, aber ich habe Funktionalität, wo yser kann verlassen und mehrere Zeit, so dass wir mehrere Benutzerperioden haben und zeigen ihm keine Nachrichten, wenn hi ist nicht Teil der Gruppe. zB hier können wir sehen, dass Benutzer nicht Teil der Gruppe zwischen 2017-05-29 17:26:00 bis 2017-05-29 19:00:00 und 2017-05-29 21:00:00 bis 2017-05-29 ist 21:30:00. so müssen wir keine während dieser Zeiträume gesendeten Nachrichten anzeigen –

+0

Geben Sie mehr Beispieldaten an, um es zu testen. –

+0

kann ich Ihnen .SQL-Datei geben? –

0

Ich bin oben nicht mit codeigniter zu beschleunigen, aber hier ist die SQL, die zurückkehren sollten, was Sie suchen:

SELECT gm.* 
FROM group_message gm 
JOIN group_users gu 
    ON gm.time between gu.join_time and gu.left_time 
WHERE user_id = $user_id 
ORDER BY gm.time DESC 
+0

Ich war dies versuchen, aber das wird nicht auf mehr als einer linken oder Join-Zeit des bestimmten Benutzers –

+0

Sicher wird es. Es sollte alle Nachrichten während der Zeiträume in jeder Zeile von group_users zurückgeben. –

Verwandte Themen