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 08-03-2010, 00:25
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard Eine kleine, harte Nuss

Hallo zusammen,

mit diesem query...

Code:
SELECT id, article_id, tstamp
FROM contribution
ORDER BY article_id, tstamp;
...erzeuge ich diese tabelle...



...jetzt möchte ich ein alternatives query schreiben, welches mir immer "nur" die ROT MARKIERTEN zeilen liefert (also immer die "erste" zeile einer article_id). Ich sitze schon seit langer Zeit da dran und komme einfach nicht auf eine korrekte und performante Lösung. Meine "beste Version" (die aber nicht läuft habe ich mittels eines modifizierten LIMIT gemacht).

Wäre GENIAL, wenn mir jemand einen Tritt/Tipp geben könnte! ;-)

Danke und Grüße,
Chris
Mit Zitat antworten
  #2 (permalink)  
Alt 08-03-2010, 00:36
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

Code:
select c1.id, c1.article_id, c1.tstamp
from contribution as c1
left join contribution as c2 on c2.article_id = c1.article_id and c2.tstamp < c1.tstamp
where c2.id is null
order by article_id
Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (08-03-2010 um 00:43 Uhr) Grund: Tippfehler im SQL korrigiert
Mit Zitat antworten
  #3 (permalink)  
Alt 08-03-2010, 00:41
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hey Amica,

vielen Dank!! Aber kann es sein, dass man aus dem "c1.id" in der WHERE-clause ein "c2.id" machen muss? (denn sonst ist das result set leer)

Code:
SELECT c1.id, c1.article_id, c1.tstamp
FROM contribution AS c1
LEFT JOIN contribution AS c2 ON c2.article_id = c1.article_id AND c2.tstamp < c1.tstamp
WHERE c2.id IS NULL
ORDER BY article_id
Danke und LG,
Chris
Mit Zitat antworten
  #4 (permalink)  
Alt 08-03-2010, 00:42
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von squirrelcgn Beitrag anzeigen
kann es sein, dass man aus dem "c1.id" in der WHERE-clause ein "c2.id" machen muss?
Richtig erkannt, war nur ein Tippfehler.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 08-03-2010, 00:49
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Uaaaaaaa, irgendetwas liegt aber noch heftigst im argen:

- Es gibt insgesamt 20170 articles (article_id).
- Nach dem "LEFT JOIN" query habe ich aber 20242 zeilen....... :-(

Direkt gefragt: gibt es noch eine Lösung OHNE LEFT JOIN? (und ohne jegliche JOINs)

Danke und Grüße,
Chris
Mit Zitat antworten
  #6 (permalink)  
Alt 08-03-2010, 00:54
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Kann es sein, dass du da 72 contributions ohne article ID hast? Such mal nach NULL-Werten in dieser Spalte.

Edit: Es gäbe eine Lösung ohne Joins, aber das wäre dann eine korrelierte Unterabfrage und die ist höchst unperformant. Dieser negative self left join ist da schon die sinnvollste Lösung. Wenn dir allerdings die contribution ID egal wäre, könntest du auch mit group by und min(tstamp) arbeiten.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (08-03-2010 um 01:12 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 08-03-2010, 00:57
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Leider nein! ;-) (mein DB-modell verbietet dies bereits...) Danke trotzdem.

Werde morgen weitergrübeln.
Mit Zitat antworten
  #8 (permalink)  
Alt 08-03-2010, 01:01
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Dann sind es die tstamp-Werte, die unerwarteter Weise null sind. In diesem Falle hättest du aber ohnehin spezifizieren müssen, ob solche tstamps als die kleinsten oder die größten betrachtet werden sollen, wenn man danach sortiert.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #9 (permalink)  
Alt 08-03-2010, 15:52
DSitC
 Registrierter Benutzer
Links : Onlinestatus : DSitC ist offline
Registriert seit: Feb 2010
Beiträge: 15
DSitC befindet sich auf einem aufstrebenden Ast
Standard

Hier noch ein alternativer SQL, wobei ich den nur der Vollständigkeit wegen hier aufnehme, die Variante von Amica sollte eigentlich performanter sein.

Code:
SELECT
  `contribution`.*
FROM
  `contribution`
  LEFT JOIN (
    SELECT
      `contribution`.`article_id`  AS `aid`,
      MAX(`contribution`.`tstamp`) AS `newest`
    FROM
      `contribution`
    GROUP BY
      `contribution`.`article_id`
  ) AS `contribution_check` ON (
    `contribution_check`.`aid` = `contribution`.`article_id`
  )
WHERE
  `contribution`.`tstamp` = `contribution_check`.`newest`
Erklärung: Das ist jetzt mit einer Subquery die über LEFT JOIN reingeholt wird und positiv prüft. Das ganze allerdings im FROM-Teil damit er die Subquery nicht für jeden Datensatz ausführt...

Geändert von DSitC (08-03-2010 um 16:00 Uhr) Grund: Die Tabelle heißt ja "contribution" und nicht "foo"... -.-
Mit Zitat antworten
  #10 (permalink)  
Alt 09-03-2010, 01:59
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo zusammen,

erst einmal vielen, herzlichen Dank für eure hervorragenden Beiträge!

@Amica: "leider" hat nur ein einziger tstamp den Wert 0000-00-00 00:00:00
@DSitC: danke, wieder was gelernt

Wie sehr ich die Daten auch "reinige" und Prüfsummen bilde und damit Checks durchführe, ich habe irgendwo einen SEMANTISCHEN Fehler in meinen Daten. Die Tabelle contribution ist nur eine von vielen, die ich während eines Workflows erzeuge.

Fange jetzt nochmal von vorne an und werde NOCH sorgfältiger vorgehen, als ich es ohnehin schon immer tue! ;-)

LG und nochmals danke,
Chris
Mit Zitat antworten
  #11 (permalink)  
Alt 09-03-2010, 04:33
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo zusammen,

wie ihr seht, lässt mich das Problem nicht mehr los! ;-) Habe jetzt alles nochmal neu aufgebaut und sehe nun, wo das Problem liegt! :-)

Jetzt würde es direkt zur Lösung führen, wenn mir jemand folgende Frage beantworten könnte:

Wie kann ich das von Amica erarbeitete Query so modifizieren, dass ich nicht nur nach 1 Spalte "suche"/"gruppiere", sondern nach 2 Spalten: also article_id UND group_id?
Hintergrund: die gleiche article ID kommt in verschiedenen groups vor, ABER das "ignoriere" ich natürlich, wenn ich die group ID nicht berücksichtige... (peinlich)

Hier nochmal das Query:
Code:
SELECT c1.id, c1.article_id, c1.tstamp
FROM contribution AS c1
LEFT JOIN contribution AS c2 ON c2.article_id = c1.article_id AND c2.tstamp < c1.tstamp
WHERE c2.id IS NULL
ORDER BY article_id;
Vielen Dank und viele Grüße,
Chris
Mit Zitat antworten
  #12 (permalink)  
Alt 09-03-2010, 08:12
DSitC
 Registrierter Benutzer
Links : Onlinestatus : DSitC ist offline
Registriert seit: Feb 2010
Beiträge: 15
DSitC befindet sich auf einem aufstrebenden Ast
Standard

Das müsste dann so aussehen, denke ich mal...

Code:
SELECT
  c1.id,
  c1.group_id,
  c1.article_id,
  c1.tstamp
FROM
  contribution AS c1
  LEFT JOIN contribution AS c2 ON (
    c2.group_id = c1.group_id AND
    c2.article_id = c1.article_id AND
    c2.tstamp < c1.tstamp
  )
WHERE
  c2.id IS NULL
ORDER BY
  article_id;
Mit Zitat antworten
  #13 (permalink)  
Alt 09-03-2010, 14:59
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielen Dank, DSitC!!

Das genau löst es (hätte ich auch gut mal selbst drauf kommen können - war wohl etwas spät gestern...).

LG,
Chris
Mit Zitat antworten
  #14 (permalink)  
Alt 09-03-2010, 15:39
DSitC
 Registrierter Benutzer
Links : Onlinestatus : DSitC ist offline
Registriert seit: Feb 2010
Beiträge: 15
DSitC befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von squirrelcgn Beitrag anzeigen
Vielen Dank, DSitC!!

Das genau löst es (hätte ich auch gut mal selbst drauf kommen können - war wohl etwas spät gestern...).

LG,
Chris
Naja, das SQL stammt ja von Amica, ich hab nur eine Zeile eigefügt... ;-)
Mit Zitat antworten
  #15 (permalink)  
Alt 09-03-2010, 19:29
squirrelcgn
 Registrierter Benutzer
Links : Onlinestatus : squirrelcgn ist offline
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
squirrelcgn ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay, ich habe natürlich auch Amicas Beitrag positiv bewertet (mit dem Bewertungstool)... aber das DANKE von vorhin gilt natürlich auch euch BEIDEN!

@ Amica und DSitC

;-)
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
Harte Nuss für Profis !? admin129 Projekthilfe 4 04-03-2009 11:25
Eine ganz kleine Frage Gaint PHP Developer Forum 20 21-04-2006 23:19
harte nuss für coder ;-) Psycomantis PHP Developer Forum 26 04-09-2003 00:25
Das Internet ist eine kleine Welt Berni News / Kostenloses 3 26-08-2003 12:35
eine kleine frage ArnoK PHP Developer Forum 3 04-06-2001 20:12

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 19:20 Uhr.