SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 13.11.2010, 09:45:22
c-bob c-bob ist offline
Anfänger
 
Registriert seit: Nov 2010
Alter: 47
Beiträge: 5
Reihenfolge nach JOIN / GROUP BY festlegen

Hallo Gemeinde!

Ich habe bei der Abfrage über drei Tabellen ein Problem mit der Reihenfolge des Ergebnisses nach einem Group By.

Bei folgender Abfrage wird die Gruppe mit der c.id=8 als letztes angezeigt, obwohl in der Gruppe ein Beitrag als letztes erstellt wurde (Spalte publish_up in Tab: content) und eigentlich somit vor allen anderen erscheinen sollte:

Code:
SELECT c.id c_id, c.title c_title, a.title , a.modified, a.publish_up , s.title, s.id s_id FROM categories c 
join content a ON a.catid=c.id
join sections s on c.section=s.id
where s.id=3
GROUP BY c_id
ORDER BY publish_up DESC
Das Ergebnis ist folgendes:
Code:
"c_id";"c_title";"title";"modified";"publish_up";"title";"s_id"
---------------------------------------------------------------------------------------
"9";"cat_9_3";"t12_9_3";"2010-05-16 11:24:19";"2010-05-14 16:40:33";"sec3";"3"
"7";"cat_7_3";"t3_7_3";"2010-05-14 11:24:19";"2010-05-13 16:40:33";"sec3";"3"
"8";"cat_8_3";"t6_8_3";"2010-05-11 11:24:19";"2010-05-10 16:40:33";"sec3";"3"
Die dritte Zeile soll aber an Pos 1, da dort ein Beitrag mit dem Datum (publish_up) vom 15.05. eingetragen ist.
Hat dazu vielleicht jemand eine Idee?

Die Tabellen sehen folgendermaßen aus:

Tabelle 1:
Code:
CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  `section` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

INSERT INTO `categories` (`id`, `title`, `section`) VALUES
(1, 'cat_1_1', '1'),
(2, 'cat_2_1', '1'),
(3, 'cat_3_1', '1'),
(4, 'cat_4_2', '2'),
(5, 'cat_5_2', '2'),
(6, 'cat_6_2', '2'),
(7, 'cat_7_3', '3'),
(8, 'cat_8_3', '3'),
(9, 'cat_9_3', '3'),
(10, 'cat_4_4', '4'),
(11, 'cat_4_4', '4'),
(12, 'cat_4_4', '4'),
(13, 'cat_4_4', '4'),
(14, 'cat_4_4', '4'),
(15, 'cat_4_4', '4'),
(16, 'cat_4_4', '4');
Tabelle 2:
Code:
CREATE TABLE IF NOT EXISTS `content` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  `state` tinyint(3) NOT NULL default '0',
  `sectionid` int(11) unsigned NOT NULL default '0',
  `catid` int(11) unsigned NOT NULL default '0',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `publish_up` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`),
  KEY `idx_section` (`sectionid`),
  KEY `idx_catid` (`catid`)
);

INSERT INTO `content` (`id`, `title`, `state`, `sectionid`, `catid`, `modified`, `publish_up`) VALUES
(1, 't1_1_1', 1, 1, 1, '2010-05-17 11:24:19', '2010-05-16 16:40:33'),
(2, 't2_4_2', 1, 2, 4, '2010-05-16 11:24:19', '2010-05-16 16:40:33'),
(3, 't3_7_3', 1, 3, 7, '2010-05-14 11:24:19', '2010-05-13 16:40:33'),
(4, 't4_2_1', 1, 1, 2, '2010-05-13 11:24:19', '2010-05-10 16:40:33'),
(5, 't5_5_2', 1, 2, 5, '2010-05-12 11:24:19', '2010-05-10 16:40:33'),
(6, 't6_8_3', 1, 3, 8, '2010-05-11 11:24:19', '2010-05-10 16:40:33'),
(7, 't7_1_1', 1, 1, 1, '2010-05-19 11:24:19', '2010-05-11 16:40:33'),
(8, 't8_6_2', 1, 2, 6, '2010-05-18 11:24:19', '2010-05-14 16:40:33'),
(9, 't9_8_3', 1, 3, 8, '2010-05-14 11:24:19', '2010-05-15 16:40:33'),
(10, 't10_3_1', 1, 1, 3, '2010-05-15 11:24:19', '2010-05-12 16:40:33'),
(11, 't11_6_2', 1, 2, 6, '2010-05-18 11:24:19', '2010-05-11 16:40:33'),
(12, 't12_9_3', 1, 3, 9, '2010-05-16 11:24:19', '2010-05-14 16:40:33'),
(13, 't13_2_1', 1, 1, 2, '2010-05-13 11:24:19', '2010-05-12 16:40:33'),
(14, 't14_6_2', 1, 2, 6, '2010-05-12 11:24:19', '2010-05-10 16:40:33'),
(15, 't15_7_3', 1, 3, 7, '2010-05-14 11:24:19', '2010-05-11 16:40:33'),
(16, 't16_2_1', 1, 1, 2, '2010-05-15 11:24:19', '2010-05-15 16:40:33');
Tabelle 3
Code:
CREATE TABLE IF NOT EXISTS `sections` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

INSERT INTO `sections` (`id`, `title`) VALUES
(1, 'sec1'),
(2, 'sec2'),
(3, 'sec3'),
(4, 'sec4');
Mit Zitat antworten
  #2  
Alt 13.11.2010, 15:02:22
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Schön vorbereitetes Beispiel, da fällt das antworten leicht:

Der DESC im ORDER BY bedeutet, dass der "größte, neueste" Wert zuerst ausgegeben wird. So gesehen muss anstatt DESC nur ASC geschrieben werden.

Also so:

Code:
SELECT c.id c_id, c.title c_title, a.title , a.modified, a.publish_up , s.title, s.id s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
where s.id=3
GROUP BY c_id
ORDER BY a.publish_up ASC;

+------+---------+---------+---------------------+---------------------+-------+------+
| c_id | c_title | title   | modified            | publish_up          | title | s_id |
+------+---------+---------+---------------------+---------------------+-------+------+
|    8 | cat_8_3 | t6_8_3  | 2010-05-11 11:24:19 | 2010-05-10 16:40:33 | sec3  |    3 |
|    7 | cat_7_3 | t3_7_3  | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 | sec3  |    3 |
|    9 | cat_9_3 | t12_9_3 | 2010-05-16 11:24:19 | 2010-05-14 16:40:33 | sec3  |    3 |
+------+---------+---------+---------------------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql>
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #3  
Alt 14.11.2010, 08:12:40
c-bob c-bob ist offline
Anfänger
 
Registriert seit: Nov 2010
Alter: 47
Beiträge: 5
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Hallo thomas_w und danke für die Antwort.

ABER: so einfach ist das dann doch nicht. Es sollte schon das DESC bleiben, weil die neuesten ja zuerst ausgegeben werden sollen.
Mein Problem dabei ist aber, dass die Reiehenfolge zwar ohne GROUP BY stimmt, aber ich benötige ja gerade das GROUP BY, da ich nicht im Nachhinein nochmal das Arrray nach den c_id durchsuchen will.

Zum besseren Verständnis: schau mal in 'content.id=9' nach, dort steht 'catid=8' welches aber bei 'published_up=2010-05-15...' zu stehen hat. Das möchte ich beim GROUP BY berücksichtigt haben, so dass die category mit dem neusten content nach einem GROUP BY immernoch vorne steht, verstehst? Ich weiss aber nicht, wie ich es anstellen muss.

Gut erkennbar ist das, wenn man das GROUP BY in der Anfrage einfach mal weg lässt:
Code:
+------+---------+---------+---------------------+---------------------+-------+------+
| c_id | c_title | title   | modified            | publish_up          | title | s_id |
+------+---------+---------+---------------------+---------------------+-------+------+
|    8 | cat_8_3 | t9_8_3  | 2010-05-14 11:24:19 | 2010-05-15 16:40:33 | sec3  |    3 | 
|    9 | cat_9_3 | t12_9_3 | 2010-05-16 11:24:19 | 2010-05-14 16:40:33 | sec3  |    3 | 
|    7 | cat_7_3 | t3_7_3  | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 | sec3  |    3 | 
|    7 | cat_7_3 | t15_7_3 | 2010-05-14 11:24:19 | 2010-05-11 16:40:33 | sec3  |    3 | 
|    8 | cat_8_3 | t6_8_3  | 2010-05-11 11:24:19 | 2010-05-10 16:40:33 | sec3  |    3 | 
+------+---------+---------+---------------------+---------------------+-------+------+
Dort wird in der ersten Zeile der aus 'content' stammende 'title=t9_8_3' folgerichtige einsortiert und ausgegeben. Dieser wird aber eben bei dem gruppieren mittels GROUP BY nicht berücksichtigt und nur der untere genutzt.
Mit Zitat antworten
  #4  
Alt 14.11.2010, 13:12:36
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Zitat:
Zitat von c-bob Beitrag anzeigen
Dort wird in der ersten Zeile der aus 'content' stammende 'title=t9_8_3' folgerichtige einsortiert und ausgegeben. Dieser wird aber eben bei dem gruppieren mittels GROUP BY nicht berücksichtigt und nur der untere genutzt.
Gut, ich glaube jetzt habe ich verstanden, was Du möchtest.

Das wesentliche Problem ist die "falsche" Verwendung des GROUP BY, den MySQL leider erlaubt (andere Datenbanken nicht). Per SQL-Standard müssen alle weiteren Spalten (außer den GROUP BY Spalten) mit einem Aggregat Befehl ( MIN(), MAX(), SUM(), AVG(), ...) versehen werden, da sonst die Datenbank nicht weiß, ob sie den unteren, den oberen oder was auch immer Wert der Gruppe verwenden soll. In diese Falle bist Du getappt.

Lösung:

Code:
SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id=3
GROUP BY c.id
ORDER BY a.publish_up ASC;

+------+---------+---------+---------------------+---------------------+---------+------+
| c_id | c_title | a_titel | a_modified          | a_puplish_up        | s_title | s_id |
+------+---------+---------+---------------------+---------------------+---------+------+
|    8 | cat_8_3 | t9_8_3  | 2010-05-14 11:24:19 | 2010-05-15 16:40:33 | sec3    |    3 |
|    7 | cat_7_3 | t3_7_3  | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 | sec3    |    3 |
|    9 | cat_9_3 | t12_9_3 | 2010-05-16 11:24:19 | 2010-05-14 16:40:33 | sec3    |    3 |
+------+---------+---------+---------------------+---------------------+---------+------+
3 rows in set (0.02 sec)

mysql>
Bei MySQL kann das korrekte Benutzen von GROUP BY erzwungen werden. D.h. bei Deinem bisherigen Query käme dann ein SQL-Error.

Stimmt das Ergebnis?

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 14.11.2010, 16:41:53
c-bob c-bob ist offline
Anfänger
 
Registriert seit: Nov 2010
Alter: 47
Beiträge: 5
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Zitat:
Zitat von thomas_w Beitrag anzeigen
Code:
+------+---------+---------+---------------------+---------------------+---------+------+
| c_id | c_title | a_titel | a_modified          | a_puplish_up        | s_title | s_id |
+------+---------+---------+---------------------+---------------------+---------+------+
|    8 | cat_8_3 | t9_8_3  | 2010-05-14 11:24:19 | 2010-05-15 16:40:33 | sec3    |    3 |
|    7 | cat_7_3 | t3_7_3  | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 | sec3    |    3 |
|    9 | cat_9_3 | t12_9_3 | 2010-05-16 11:24:19 | 2010-05-14 16:40:33 | sec3    |    3 |
+------+---------+---------+---------------------+---------------------+---------+------+
3 rows in set (0.02 sec)
Stimmt das Ergebnis?
Hm, nee, immer noch nicht so richtig. Wenn Du Dir mal die fetten Daten (s.o.) ansiehst, dann sollte das noch einmal vertauscht sein.
Soweit ich das jetzt auch direkt in der Doku und im mysql-Forum gelesen habe, muss man sich dem Problem des "groupwise max" anders helfen. Entweder macht man das mittels subqueries (soll wohl sehr Ressourcen-hungrig sein) oder einem JOIN mit sich selbst und entsprechendenBedingungen.

Hab das mal versucht, aber da habe ich nun das Problem, dass wenn nur ein Eintrag in einer cat ist (wie z.b. bei 'catid=9'), dann würde dieser nicht mit angezeigt werden:

Code:
SELECT c.id c_id, c.title c_title, a1.title , a1.modified, a1.publish_up
  FROM content a1 
JOIN content a2 ON (a1.catid = a2.catid and a1.publish_up>a2.publish_up)
JOIN categories c ON a1.catid=c.id
  WHERE a1.sectionid =3

ORDER BY a1.publish_up DESC
(habe das JOIN mit tab 'sections' mal der Übersichtlichkeit halber weg gelassen)

Ergebnis:
Code:
+------+---------+--------+---------------------+---------------------+
| c_id | c_title | title  | modified            | publish_up          |
+------+---------+--------+---------------------+---------------------+
|    8 | cat_8_3 | t9_8_3 | 2010-05-14 11:24:19 | 2010-05-15 16:40:33 | 
|    7 | cat_7_3 | t3_7_3 | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 | 
+------+---------+--------+---------------------+---------------------+
Wie man sieht, fehlt dort nun die Zeile mit der 'c_id=9'. Diese sollte sich eigentlich dazwischen eingeordnet haben :-/

Man man man, ist wirklich recht komplex. Da wäre das sicherlich gut, sich mal mit jemandem zu unterhalten, der das schon drauf hat - sonst ist der Lernprozess ein recht langwieriger. Hielt mich in Logik eigentlich für recht fit, nur muss man hierbei erstmal die richtigen Regeln kennen leren.... ;-)
Mit Zitat antworten
  #6  
Alt 14.11.2010, 16:59:07
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Da hast Du natürlich recht, das sortieren soll nicht nach der Spalte a.puplish_up erfolgen, sondern nach dem Ergebnis der MAX(a.puplish_up) AS a_puplish_up Berechnung.

Also so:

Code:
SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id=3
GROUP BY c.id
ORDER BY a_puplish_up DESC ;

+------+---------+---------+---------------------+---------------------+---------+------+
| c_id | c_title | a_titel | a_modified          | a_puplish_up        | s_title | s_id |
+------+---------+---------+---------------------+---------------------+---------+------+
|    8 | cat_8_3 | t9_8_3  | 2010-05-14 11:24:19 | 2010-05-15 16:40:33 |    sec3 |    3 |
|    9 | cat_9_3 | t12_9_3 | 2010-05-16 11:24:19 | 2010-05-14 16:40:33 |    sec3 |    3 |
|    7 | cat_7_3 | t3_7_3  | 2010-05-14 11:24:19 | 2010-05-13 16:40:33 |    sec3 |    3 |
+------+---------+---------+---------------------+---------------------+---------+------+
3 rows in set (0.01 sec)

mysql>
Besser..?

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #7  
Alt 14.11.2010, 21:54:20
c-bob c-bob ist offline
Anfänger
 
Registriert seit: Nov 2010
Alter: 47
Beiträge: 5
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Hm, jep, so funktionierts anscheinend auch richtig. Bin jetzt allerdings nicht wirklich dahinter gekommen, warum nun alle Spalten ein MAX() davor gestellt bekamen. Und auf meine konkrete DB bezogen, gibt es noch einige kleine Unstimmigkeiten, die mir auch nicht so recht verständlich erscheinen. :-/ Aber egal, Zeit drängt erstmal, daher werd ich es erstmal so belassen - danke Thomas!

Desweiteren ist das eigentlich nur ein Teil der Abfrage, welche ich benötige. Wie man in der Hierarchie vielleicht schon erkennen kann, ist das ja noch einmal in Bereiche/Sections eingeteilt, welche dann die Kategorien beinhalten. Nun benötige ich eigentlich aus mehreren Bereichen die 3 letzten Kategorien entsprechend der obigen Abfrage. Da bin ich nun völlig am Ende mit meinem Latein - Verzeihung SQL.
Ich nutze hierbei den Umweg über eine Schleife, in der ich einfach die WHERE-clause 's.id=x' verändere.

Oder gibt es dazu vielleicht auch Ansätze?
Mit Zitat antworten
  #8  
Alt 14.11.2010, 22:11:46
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Zwei mögliche Lösungswege

a) WHERE erweitern mit IN()...

Code:
SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id IN (3,4,5)
GROUP BY c.id
ORDER BY a_puplish_up DESC ;

b) Mehrere SQL verbinden mit UNION ALL

Code:
SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id = 3
GROUP BY c.id

UNION ALL

SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id = 4
GROUP BY c.id

UNION ALL

SELECT c.id AS c_id, 
       MAX(c.title) AS c_title, 
       MAX(a.title) AS a_titel, 
       MAX(a.modified) AS a_modified,
       MAX(a.publish_up) AS a_puplish_up,
       MAX(s.title) AS s_title, 
       MAX(s.id) AS s_id 
  FROM categories c 
  JOIN content a 
    ON a.catid=c.id
  JOIN sections s 
    ON c.section=s.id
WHERE s.id = 5
GROUP BY c.id


ORDER BY a_puplish_up DESC ;

Viel Erfolg!

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #9  
Alt 15.11.2010, 07:08:09
c-bob c-bob ist offline
Anfänger
 
Registriert seit: Nov 2010
Alter: 47
Beiträge: 5
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Ja, die erste Lösung ist in soweit okay, als dass sie mindestens die gewünschte Lösungsmenge ergibt, aber ich will hier genauso nicht das Array auswerten, da ich genau die letzten 3 brauche und nicht alle.
LIMIT 3 ist ja für die Lösung mit der Schleife und der Nacheinanderabfrage der einzelnen sections ausreichend, aber wenn dann mehrere sections einfließen sollen, dann ist schlecht.

Aber mal zu der erfolgreichen Lösung mit nur einer section aus Deinem Post davor: kannst Du eine kurze Erklärung dazu geben, warum überall ein MAX davor steht?

Danke übrigens nochmal für Deine Hilfe
-.c.-
Mit Zitat antworten
  #10  
Alt 15.11.2010, 08:33:50
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Reihenfolge nach JOIN / GROUP BY festlegen

Zitat:
Zitat von c-bob Beitrag anzeigen
Aber mal zu der erfolgreichen Lösung mit nur einer section aus Deinem Post davor: kannst Du eine kurze Erklärung dazu geben, warum überall ein MAX davor steht?
Der Grund ist folgendes:

Zitat:
Das wesentliche Problem ist die "falsche" Verwendung des GROUP BY, den MySQL leider erlaubt (andere Datenbanken nicht). Per SQL-Standard müssen alle weiteren Spalten (außer den GROUP BY Spalten) mit einem Aggregat Befehl ( MIN(), MAX(), SUM(), AVG(), ...) versehen werden, da sonst die Datenbank nicht weiß, ob sie den unteren, den oberen oder was auch immer Wert der Gruppe verwenden soll. In diese Falle bist Du getappt.
MySQL spricht in diesem Fall von "hidden columns":

Zitat:
Bei der Anwendung dieser Funktion müssen alle Datensätze jeder Gruppe die gleichen Werte für die Spalten haben, die vom GROUP BY-Anteil ausgelassen werden. Der Server kann jeden beliebigen Wert aus der Gruppe zurückgeben, was zu unbestimmten Ergebnissen führt, wenn die Werte nicht übereinstimmen.
http://dev.mysql.com/doc/refman/5.1-...n-columns.html

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
Antwort

Stichworte
group by, join, reihenfolge


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sortierung einer Inner Join Abfrage mit Group By Klausel Oskar MySQLi/PDO/(MySQL) 1 31.08.2010 22:56:29
Using filesort / temporary - JOIN, GROUP BY, ORDER BY ryda MySQLi/PDO/(MySQL) 4 08.05.2009 23:06:05
INNER JOIN, GROUP BY und ... schwer zu erklären abyss MySQLi/PDO/(MySQL) 2 15.06.2008 10:38:22
Zwei Aggregatfunktionen in JOIN über drei Tabellen Nico #949494 MySQLi/PDO/(MySQL) 1 29.03.2007 15:47:58
mysql query mit Join problem Silencer PHP für Fortgeschrittene und Experten 4 18.03.2003 16:38:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:15:17 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt