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 16-10-2008, 09:56
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard DISTINCT und MAX kombinieren?

Hi

Ich habe eine Tabelle mit mehreren Feldern. Die wichtigen sind FixS (varchar) ind time (int, phptimestamp time())

Nun möchte ich gerne alle Einträge aus dieser Tabelle auslesen, jedoch nur immer einen wo FixS gleich ist, und time der höchste wert ist.

Wie mache ich das am bessten? Kann ich sowas machen, und wenn ja gibt es was besseres oder wäre dies ok SELECT DISTINCT(FixS), MAX(time)

Danke schonmal für eure Tipps.

Gruss

Olli
Mit Zitat antworten
  #2 (permalink)  
Alt 16-10-2008, 10:02
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein, GROUP BY + HAVING COUNT sind deine Freunde.
Mit Zitat antworten
  #3 (permalink)  
Alt 16-10-2008, 10:17
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Danke dir. Ich kann leider noch nicht testen. Hab mir nun mal durchgelesen was das genau ist. Würde denn diese Abfrage funktionieren wie ich das möchte?

SELECT FixS, time
FROM TestTabelle
GROUP BY FixS <--- Damit immer nur ein Eintrag ausgegeben wird mit dem Wert aus FixS und nicht alle Einträge wo FixS gleich ist
HAVING COUNT(time) <--- Damit der Eintrag genommen wird wo time am höchsten ist.

Danke schonmal.

Gruss

Olli
Mit Zitat antworten
  #4 (permalink)  
Alt 16-10-2008, 10:27
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein. Du möchtest:

1. den höchten Wert von Time => max(time) ist die Lösung
2. wo Werte in FixS mehr als einmal vor kommt => Count(FixS) >1

=> select FixS, max(time) As maxtime from ... group by FixS having count(FixS)>1
Mit Zitat antworten
  #5 (permalink)  
Alt 16-10-2008, 10:38
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke dir

Da hab ich wohl was falsch verstanden gehabt sorry.

Gruss

Olli
Mit Zitat antworten
  #6 (permalink)  
Alt 16-10-2008, 14:39
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Ich konnte es nun testen. Funktioniert leider nicht so ganz.

Das mit GROUP BY hat geklappt. Ich bekomme jeweils nur einen datensatz wo dieses Feld FixS gleich ist.

Das HAVING habe ich mal weggelassen. Ich glaube ich habe mich da blöd ausgedruckt.

Das Problem ist wenn ich das mit MAX(time) mache und GROUP BY. Wird aus irgend einem Grund nicht der eintrag genommen wo die grösste Zeit drin ist, sondern einfach das feld wo er das erstemal den wert von FixS findet. Habe es auch am ende mit ORDER BY time DESC probiert. Jedoch ohne erfolg

Hast du da noch eine Idee? Habe bisher leider noch kein Fehler ausfindig machen können.

Gruss

Olli

Geändert von Olli4 (16-10-2008 um 14:44 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 16-10-2008, 15:15
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wie sieht deine aktuelle Abfrage aus?
Mit Zitat antworten
  #8 (permalink)  
Alt 16-10-2008, 15:20
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Ups. Sorry habe ich vergessen zu schreiben:
Probiert habe ich folgendes:
SELECT FixS, max(time) AS maxtime
FROM TestTabelle
GROUP BY FixS
und
SELECT FixS, max(time) AS maxtime
FROM TestTabelle
GROUP BY FixS
ORDER BY time DESC

Wenn ich HAVING COUNT verwende, gibt er mir nur noch die einträge aus wo er merere einträge von FixS findet. Er soll mir jedoch auch die einzelnen ausgeben. Daher habe ich dies weggelassen.

Gruss

Olli
Mit Zitat antworten
  #9 (permalink)  
Alt 16-10-2008, 15:24
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ORDER by maxtime ist richtiger!

Frage: wasfür einen Typ ist die Spalte time? Und wie sehen die Werte darin aus?
Mit Zitat antworten
  #10 (permalink)  
Alt 16-10-2008, 15:27
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

time ist INT(11) und beinhaltet den timestamp den PHP mittels time() generiert. also z.B. 1224160093.

Bei mir hat ORDER BY time DESC nur die auswirkung in der Sortierung nachher in der while schleife von PHP.
Also er Ordnen die gesamte ausgabe das im WHILE zuerst der Datensatz mit der neusten oder ältesten Zeit kommt. Jedoch nicht welchen Datensatz wo FixS gleich ist er nimmt.

Gruss

Olli
Mit Zitat antworten
  #11 (permalink)  
Alt 16-10-2008, 15:36
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich habe nun folgendes gemacht, was funktionieren würde:
Code:
SELECT t.FixS, max(t.time) AS maxtime
FROM TestTabelle t
WHERE time = (
  SELECT MAX(time) FROM TestTabelle WHERE FixS = t.FixS GROUP BY FixS
)
GROUP BY t.FixS
ORDER BY t.time DESC
Die frage wäre jedoch nun ob dies sinn macht, oder ob ich hier schrott produziert habe.

Gruss

Olli

EDIT: Sorry für den Doppelpost.

Geändert von Olli4 (16-10-2008 um 18:03 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 16-10-2008, 21:30
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das ist unfug und warum sortierst du nach etwas, was du nicht bekommst?

SELECT FixS, max(time) AS maxtime
FROM TestTabelle
GROUP BY FixS
ORDER BY maxtime DESC

reicht völlig aus.
Mit Zitat antworten
  #13 (permalink)  
Alt 16-10-2008, 22:00
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Jetzt habe ich langsam raus warum es für mich nicht stimmt. Ggf habe ich mich auch blöd ausgedruckt.
Er gibt mir mit deiner Lösung wirklich die höchste Zeit. Jedoch nicht ganz wie erhoft. Er gibt mir time = höchster wert. Jedoch nimmt er alle anderen felder die ich mit dieser SELECT abfrage auslese den ersten vorkommenden. Sogar wenn ichs direkt in phpmyadmin ausführe.

Gibt es denn eine Möglichkeit den spies so umzudrehen, das er mir nicht die höchste Zeit ausliest, sondern den gesamten DB Eintrag wo die höchste Zeit drin ist?

Sorry das ichs was falsch beschrieben habe.

Danke schonmal.

Gruss

Olli
Mit Zitat antworten
  #14 (permalink)  
Alt 16-10-2008, 22:19
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Code:
SELECT t.*
FROM ( SELECT FixS, MAX(time) AS time FROM TestTabelle GROUP BY FixS ) m
INNER JOIN TestTabelle t USING ( FixS, time )

Geändert von h3ll (16-10-2008 um 22:22 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 16-10-2008, 22:20
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Seufz, warum liest du meine Antwort nicht: http://www.php-resource.de/forum/sho...800#post601800
Mit Zitat antworten
Antwort

Lesezeichen


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

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 06:35 Uhr.