php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.01.2012, 22:54  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Group by having ...

Hallo Freunde,

ich habe folgende MySQL Anweisung.

PHP-Code:
$sql "SELECT * FROM `".$table."` WHERE `to_id` = '".$id."' OR `from_id` = '".$id."' GROUP BY `from_id` HAVING `from_id` <>  ".$id." ORDER BY `date` DESC;";                    
$query mysql_query($sql) or die(mysql_error()); 
Das Problem hierbei ist, dass ich die Spalten `from_id` OR `to_id` anspreche. Gleichzeitig verhindere ich mit dem HAVING bei GROUP BY das `from_id` = $id geladen werden kann. Und das ist nicht Sinn der Sache.

Besteht eine andere Möglichkeit nach `from_id` zu gruppieren außer die `from_id`ist = der Benutzerid?

Ich hoffe ihr habt verstanden was mein problem ist

Vielen Dank im voraus
thiagojonas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.01.2012, 23:10  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Machs ohne GROUP BY und mit DISTINCT:
SELECT DISTINCT IF (from_id = $id, to_id, from_id) FROM table WHERE from_id = $id OR to_id = $id

Gegebenenfalls ist es einfacher beide Verbindungen in beiden Richtungen zu speichern. Nehmen wir an es geht um eine Private Message, dann musst (zumindest nach meiner Auffassung) du sowieso zwei Kopien anlegen, einmal im Ausgang und einmal im Eingang.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 29.01.2012, 23:27  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Vielen Dank.

Wie meinst du das mit in zwei Richtungen abspeichern?

Also im Grunde wir es ein Nachrichtensystem.

Das Problem jetzt ist aber, das ich folgende Daten nicht laden kann:

PHP-Code:
        $sql "SELECT DISTINCT IF (`from_id` = '".$id."', `to_id`, `from_id`)  FROM `".$table."` WHERE `to_id` = '".$id."' OR `from_id` = '".$id."' ORDER BY `date` DESC;";                    
        
$query mysql_query($sql) or die(mysql_error());
            
        while(
$row mysql_fetch_array($query))
        
        {
            
        
            
$this->m_id $row['tab_message_id'];
            
$this->m_t_id $row['to_id'];
            
            
$this->m_g_f_id $row['from_id'];
            
$this->m_g_t_id $row['to_id'];
            
            
$this->m_message utf8_encode($row['message']);
            
$this->m_date $row['date'];
            
$this->m_read $row['read']; 
PS: Das soll dazu dienen, das egal ob man nur eine Nachricht versendet oder bekommen hat , nur die Person mit dem man den Dialog hat, anzeigt. Wenn man dann drauf klickt, öffnet sich der ganze Dialog zwischen dem Benutzern.

Die anderen Daten der Nachricht brauche ich, weil ich die letzte gesendete oder erhaltene Nachricht anzeigen möchte.

Geändert von thiagojonas (29.01.2012 um 23:31 Uhr).
thiagojonas ist offline   Mit Zitat antworten
Alt 30.01.2012, 02:02  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Also jetzt habe ich es schonmal so hingekriegt, dass alle Daten der Nachricht geladen werden.

PHP-Code:
//Query
        
$sql "SELECT  c2.from_id , to_id
                FROM (SELECT DISTINCT IF (`from_id` <> '"
.$id."', `from_id`, `to_id`)
                from_id
                 FROM `"
.$table."` AS C WHERE `to_id` = '".$id."' OR `from_id` = '".$id."' ORDER BY `date` DESC
                ) AS c1
                   JOIN `"
.$table."` AS c2 ON c1.from_id = c2.from_id    ";            
        
$query mysql_query($sql) or die(mysql_error());

               while(
$row mysql_fetch_array($query))
        
        {
            
            
$this->m_g_f_id $row['from_id'];
            
$this->m_g_t_id $row['to_id'];
            
            
$sql_m "SELECT * FROM `".$table."` WHERE `to_id` = '".$this->m_g_t_id."' AND `from_id` = '".$this->m_g_f_id."' OR `to_id` = '".$this->m_g_f_id."' AND `from_id` = '".$this->m_g_t_id."' ORDER BY `date` DESC LIMIT 1;";                    
            
$query_m mysql_query($sql_m) or die(mysql_error());
        
                while(
$row_m mysql_fetch_array($query_m))
            {
                
// Seitenparameter aus Tabelle laden und in Variablen speichern
                
$this->m_id $row_m['tab_message_id'];
                
$this->m_t_id $row_m['to_id'];
                
                
$this->m_message utf8_encode($row_m['message']);
                
$this->m_date $row_m['date'];
                
//.... 
Das klappt wunderbar. Allerdings habe ich noch bei der ersten Abfrage Probleme.

Wie kann ich das machen, dass nur die Nachrichten mit DISTINCT gruppiert werden, deren `from_id` <> $id (BenutzerID) sind?
thiagojonas ist offline   Mit Zitat antworten
Alt 30.01.2012, 02:27  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.629
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von thiagojonas Beitrag anzeigen
PS: Das soll dazu dienen, das egal ob man nur eine Nachricht versendet oder bekommen hat , nur die Person mit dem man den Dialog hat, anzeigt. Wenn man dann drauf klickt, öffnet sich der ganze Dialog zwischen dem Benutzern.
Zitat:
$sql = "SELECT c2.from_id , to_id
FROM (SELECT DISTINCT IF (`from_id` <> '".$id."', `from_id`, `to_id`)
from_id
FROM `".$table."` AS C WHERE `to_id` = '".$id."' OR `from_id` = '".$id."' ORDER BY `date` DESC
) AS c1
JOIN `".$table."` AS c2 ON c1.from_id = c2.from_id ";

Warum so unendlich kompliziert?

Einfaches Beispiel (nicht Copy&Paste geeignet):
PHP-Code:
$res mysql_query("SELECT * FROM messages WHERE from_id = '".$id."' OR to_id = '".$id."' ORDER BY date DESC"); 
Liefert dir alle Nachrichten einer $id, die entweder von dieser versendet oder empfangen wurden.

Wenn ich dich richtig verstanden habe willst du jetzt die letzte Nachricht eines Dialogs haben, und alle Nachrichten des Dialogs die du anzeigen kannst wenn man auf die letzte Nachricht klickt.

PHP-Code:
$latestMessages = array();
$allMessages = array(); 
Dann nimmst du dir erstmal einfach 2 Arrays für diese Nachrichten.

In deiner While Schleife machst du folgendes:
PHP-Code:
   $pair $data['from_id'] + $data['to_id']; 
Wenn du from_id und to_id addierst, erhälst du eine eindeutige Dialog Id. Wenn Id 2 an Id 5 sendet, und Id 5 an Id 2 antwortet,. kommt in beiden Fällen 7 raus.

PHP-Code:
   if (!array_key_exists($pair$latestMessages) {
      
$latestMessages[$pair] = $data;
   } 
Wenn die Dialog Id noch nicht in $latestMessages existiert, kam sie noch nicht vor. Also schreiben wir den Datensatz in das Array. Da wir nach Datum absteigend sortiert haben, ist dies die letzte Nachricht des Dialogs.

PHP-Code:
   if (!array_key_exists($pair$latestMessages) {
      
$allMessages[$pair] = array();   
   } 
Absicherung gegen E_NOTICE Fehler. Da ein Dialog aus meheren Einträgen besteht brauchen wir in $allMssages für jeden Dialog noch ein Unterarray, das wir erst einmal anlegen müssen wenn es noch nicht existiert.

PHP-Code:
   $allMessages[$pair][] = $data
Dann wird die Datenbankzeile in $allMessages eingetragen.

Für jede Dialog Id (from_id+to_id) existiert nun der erste gefundene Datensatz in $latestMessages, und alle Nachrichten eines Dialogs in $allMessages.

Eine Ausgabe lässt sich nun via foreach() o.Ä. sehr leicht bewerkstelligen.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

Geändert von Dark Guardian (30.01.2012 um 02:34 Uhr).
Dark Guardian ist gerade online   Mit Zitat antworten
Alt 30.01.2012, 02:39  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Okay. Danke erstmal.

Also vom Prinzip soll das genauso werden wie das nachrichtensystem von facebook.

es funktioniert alles schon soweit. das einzige problem ist gerade, dass wenn ich einen dialog z.B. mit zwei einträgen habe, diese zusammengefasst werden sollen. So das es halt keinen Schreibpartner doppelt oder wieviel Nachricht es auch immer mit der id in der db vorhanden sind, gibt.
Wenn mann dann drauf klickt, wir der ganze dialog geladen, wie bei facebook. Und das habe ich schon programmiert und es funktioniert auch.

ich gucke mir dein Vorschlag mal an..sieht sehr gut aus
thiagojonas ist offline   Mit Zitat antworten
Alt 30.01.2012, 03:35  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Danke. Ich habe es so gelöst:

Eine Zusätzliche Spalte, wo die dialogID gespeichert wird erstellt. Und ich lasse sie ganz einfach via DISTINCT gruppieren.

Vielen Dank für deinen tollen Tipp!!! und zu der Uhrzeit
thiagojonas ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] MySQL - HAVING MAX() Problem wooha Datenbanken 3 20.05.2011 15:42
Group BY Problem oder keine Lösung dafür kingbods Datenbanken 5 11.03.2011 12:44
[Erledigt] DISTINCT-artiges GROUP BY-Problem redox Datenbanken 6 26.02.2010 11:50
[Erledigt] select() method zend sum() ohne group by cosmicadi PHP Tipps 2009 1 29.04.2009 18:26
Where Anweisung vor GROUP BY einbinden. Kronic73 Datenbanken 6 06.03.2009 09:40
[Erledigt] Problem Mysql Suche Match Against | Group By litterauspirna Datenbanken 4 26.01.2009 19:59
[Erledigt] GROUP BY Reihenfolge stefanjann Datenbanken 4 02.12.2008 14:53
[Erledigt] Problem mit COUNT(*) und GROUP BY ghost120 Datenbanken 3 22.10.2008 17:14
[MySQL] DELETE nach GROUP BY JudGer Datenbanken 2 19.10.2008 19:15
Abfrage mit count, order by, group by...und Probleme BartTheDevil89 Datenbanken 2 15.06.2008 13:34
Min - Max auch ohne GROUP BY tekknotrip Datenbanken 6 17.04.2007 11:06
COUNT() & HAVING Cheesy Datenbanken 7 02.03.2007 22:03
[Erledigt] probleme beim MIN() (Group BY) 18inch Datenbanken 2 31.12.2004 11:54
mehrere COUNT() mit verschiedenen GROUP BY -- geht das? tapferesschneiderlein Datenbanken 0 08.09.2004 14:54
probleme mit GROUP Datenbanken 3 28.07.2004 09:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql distinct beide richtungen, group by having

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:52 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum