php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 28-08-2013, 19:39
Marcus-24-D
 Registrierter Benutzer
Links : Onlinestatus : Marcus-24-D ist offline
Registriert seit: Oct 2007
Beiträge: 173
Marcus-24-D befindet sich auf einem aufstrebenden Ast
Standard SQL Statement - Nachrichten

Hi, ich hab nen Problem beim erstellen meines Querys.
Folgend versuche ich aus meinen Nachrichten die jeweils letzte Nachricht egal ob gesendet oder empfangen eines users zu ermitteln.
Das klappt zwar, allerdings bekomme ich als Resultat wirklich ALLE Nachrichten.
Ich würde die für eine Übersicht ganz gerne gruppieren.
Und hier kommt das Problem. Beim benutzen von GROUP BY
funktioniert das ORDER BY irgendwie nicht mehr richtig.

Dies Statement liefert mir bislang alle Ergebnisse:

PHP-Code:
SELECT msg . * , usr.usernameusr.timezoneusr.gender, if( msg.senderid msg.ownermsg.recipientidmsg.senderid ) AS refuid
FROM mailbox 
AS msguser AS usr
WHERE msg
.owner =XXX
AND usr.id = if( msg.senderid msg.ownermsg.recipientidmsg.senderid )
#########GROUP BY usr.username#########
order by msg.sendtime desc 
xxx symbolisiert die Session userid des jeweiligen Users,
die mit Raute (#) markierte Zeile hab ich nur zur Übersicht mit dazugepackt,
denn wenn das Group By angewendet wird, bekomme ich nicht das Ergebnis welches ich haben möchte.

Bitte bitte um Anteilname, ich sitz da schon wirkliche 7 Tage dran

Dankeschön

edit: Das ganze hab ich ebend noch mit nem Join getestet. Auch hier das selbe bei der gruppierung.

PHP-Code:
SELECT msg . * , if( msg.senderid msg.ownermsg.recipientidmsg.senderid ) AS refuidusr.genderusr.usernameusr.timezone

FROM mailbox msg

LEFT JOIN user usr ON username 
usr.username

WHERE msg
.senderid=xxx

AND usr.id = if( msg.senderid msg.ownermsg.recipientidmsg.senderid )
ORDER BY msg.sendtime DESC 

Geändert von Marcus-24-D (28-08-2013 um 21:06 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 29-08-2013, 08:35
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

das Problem ist exakt dieses group by - denn du hast keinen Einfluß darauf, WELCHER Eintrag zur "Repräsentation" der Gruppe (beim Zusammenfassen wird ja 1 Eintrag für die ganze Gruppe angezeigt ) verwendet wird.

Das kannst du nur mit einer SubQuery erreichen


In deinem Fall ist die Abfrage aber viel einfacher: da du sowieso auf einen einzigen User abstellst, reicht ein simples "LIMIT 1" am Ende der Abfrage - da bekommst du exakt den neuesten Eintrag aufgrund deiner Sortierung - und auch nur EINEN - wenn du 2 ...3 oder mehr neueste Nachrichten haben willst, passt du einfach die Zahl hinterm Limit an
__________________

Wer LESEN kann, ist klar im Vorteil!
Mit Zitat antworten
  #3 (permalink)  
Alt 29-08-2013, 14:52
Marcus-24-D
 Registrierter Benutzer
Links : Onlinestatus : Marcus-24-D ist offline
Registriert seit: Oct 2007
Beiträge: 173
Marcus-24-D befindet sich auf einem aufstrebenden Ast
Standard

ne, das geht ja eben nicht so einfach *g
es ist ja nicht nur ein user. das ist ja das problem.

In der Datenbank sind halt alle Konversationen gespeichert.
jeder bekommt ne userid zugewiesen.. hier sender.id oder owner.id
da sender und owner.id ja öfters auftauchen, muss ich diese gruppieren.
diesem einzelnen user dann muss ich jeweils die aktuelle nachricht zuordnen.
das prinzip ist wie bei facebook.
das doofe ist, wenn ich das mit group by nicht hinbekommen kann,
bin ich gezwungen ein array zu kreieren indem ständige abfragen stattfinden.
das sind bei 30 verschiedenen konversationen rund 60 sql abfragen zur laufzeit.
irgendwie ist mir das ein wenig zu viel, wenn man sich vorstellt das ich viele aktive leute online habe :/
bestes beispiel welches ich vorhabe ist das facebook nachrichtensystem. in der linken übersicht.
es muss doch auch anders machbar sein ohne das ich so viele querys absetzen muss??!!
Mit Zitat antworten
  #4 (permalink)  
Alt 29-08-2013, 17:17
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Probier’s mal nach diesem Prinzip: MySQL :: MySQL 5.5 Reference Manual :: 3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 30-08-2013, 07:59
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

also irgendwie hast du die Hälfte meines Beitrags ignoriert - denn groupwise max läuft bei mysql auf subquery hinaus - aber nach wie vor seh ich in deinen Abfragen ein "WHERE msg.ownerid=XXX" und damit die Beschränkung auf EINEN, und dann reicht Limit
__________________

Wer LESEN kann, ist klar im Vorteil!
Mit Zitat antworten
  #6 (permalink)  
Alt 30-08-2013, 20:47
Marcus-24-D
 Registrierter Benutzer
Links : Onlinestatus : Marcus-24-D ist offline
Registriert seit: Oct 2007
Beiträge: 173
Marcus-24-D befindet sich auf einem aufstrebenden Ast
Standard

mh? irgendwie verstehen wir uns da falsch, ich hab mich falsch ausgedrückt, du oder ich falsch verstanden.
Ich versuchs mal.

Mit 5 leuten habe ich geschrieben.
Mit jedem, sagen wir mal 3 Nachrichten getauscht.

Dann habe ich insg. 15 Nachrichten, je 3 mit jedem von diesen.
Ich möchte aber nicht alle angezeigt bekommen, sondern jeweils die letzte Nachricht mit dem User und dessen Nicknamen von jeweils einem der User.
Also keine doppelten Ausgaben der Nicknames.

Wieso reicht dann da ein simples limit 1 ???

Wenn ich 5 Ergebnisse erwarte?
Mit Zitat antworten
  #7 (permalink)  
Alt 30-08-2013, 21:02
Marcus-24-D
 Registrierter Benutzer
Links : Onlinestatus : Marcus-24-D ist offline
Registriert seit: Oct 2007
Beiträge: 173
Marcus-24-D befindet sich auf einem aufstrebenden Ast
Standard

######################
# User 5 - irgendwan..vor 1 woche
######################

######################
# User 2 - trink doch.. vor 9 min
######################

######################
# User 4 - ja, vielleic.. vor 13 tagen
######################


Ich hab das jetzt mal etwas umgestaltet, in der Hoffnung das ich so besser vorwärts komme.
Aber auch das scheitert *g

Ich habe nun 2 Tabellen angelegt.
Die eine, welche die Teilnehmer speichert und die andere wo die Nachrichten Abgelegt werden.

Tabelle nachrichtenbox_conversations hat:
- id
- streamid
- user
- refuser

Tabelle nachrichtenbox hat:
- streamid
- text
- sendtime

Tabelle User hat:
- id
- username

Folgende Abfrage bringt mir das richtige Ergebnis:

PHP-Code:
SELECT 
conv
.user,
conv.refuser,
conv.streamid,
usr.username,
(
select text from nachrichtenbox as msg where msg.streamid conv.streamid order by msg.sendtime desc limit 1) as text
FROM
    nachrichtenbox_conversation 
as conv
JOIN
    user 
AS usr
ON
    usr
.id refuser

where user 
XXX 
Ein weiteres Problem hier ist, das ich damit recht unflexibel bin.
Ich brauche ja noch sendtime für die Zeitberechnung.
Ein weiteres Subquery für jedes weitere Element ist da doch recht doof.
Mit nem weiteren Join bekomme ich zwar wieder alle Datenfelder,
leider aber auch wieder alle Nachrichten :/
Lässt sich der Join nicht irgendwie limitieren?

Ich hab echt keine Ahnung mehr was ich noch Probieren soll

Geändert von Marcus-24-D (31-08-2013 um 02:25 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 01-09-2013, 00:37
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

irgendwie hast du das Manual zum Thema aber auch nicht richtig gelesen - dein Subquery steckt im Select und gehört aber in den Where - Teil bzw wie hier in ein Join - wie hier im Beispiel lohnt es manchmal einen Self-Join zu bauen, um die gleiche Tabelle noch einmal zur Verfügung zu haben



es sollte sich analog dieses Beispiels bauen lassen
Code:
SELECT s1.article, dealer, s1.price
FROM shop s1 
JOIN (   
    SELECT article, MAX(price) AS price   
    FROM shop   GROUP BY article) AS s2   
  ON s1.article = s2.article AND s1.price = s2.price;
hier geht es darum, jeweils den höchsten Preis eines Händlers zu finden, bei dir halt das höchste Datum in Beziehung zu einem Mail-Partner ... sollte sich doch anpassen lassen
__________________

Wer LESEN kann, ist klar im Vorteil!

Geändert von eagle275 (01-09-2013 um 00:40 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 06-09-2013, 02:31
Guenni61
 Registrierter Benutzer
Links : Onlinestatus : Guenni61 ist offline
Registriert seit: Nov 2011
Ort: Viersen
Beiträge: 128
Guenni61 befindet sich auf einem aufstrebenden Ast
Standard

Hi Marcus-24-D,

die Unterabfrage darf ja nur einen Datensatz/ein Tabellenfeld zurückgeben.

Wenn du mehr Tabellenfelder abfragen willst, kannst du die Tabellenfelder mittels concat_ws(string "Trennzeichen", feld1 [, feld2, feld3 . . .]) zu einem Feld zusammenfassen:

PHP-Code:
 . . .
(
select concat_ws("Trennzeichen"textsendtimefrom nachrichtenbox as msg
 
 where msg
.streamid conv.streamid order by msg.sendtime desc limit 1) as text
. . . 
Im PHP-Code splittest du test wieder auf:

PHP-Code:
 . . .
list(
$msg$gesendet) = explode("Trennzeichen"$abfrage_ergebnis['text']);
 echo 
'Nachricht gesendet am: '.$gesendet;
 echo 
$msg;
. . . 
Gruß
Günni
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[SQL allgemein] Probleme mit SQL-Statement andy1983 SQL / Datenbanken 5 30-04-2009 17:38
sql statement falsch? romu2000 SQL / Datenbanken 8 20-03-2006 10:18
[SQL allgemein] hilfe bei sql statement Pflugi SQL / Datenbanken 12 23-08-2005 16:38
SQL Statement Problem Hazzardous SQL / Datenbanken 2 07-12-2004 19:14
Text in SQL-Statement bweichel SQL / Datenbanken 3 03-12-2004 21:54

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:59 Uhr.