• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] SQL Query / PHP hängt sich bei Vergleich auf

CGollhardt

Mitglied
Hallo Miteinander,

ich sitze hier vor einem sehr kommischen Problem.

Es geht dabei um folgenden Query:

Code:
SELECT id, parentid, pagetitle, linktitle, authorid, creationtime, updatetime, published, publicationlevel, islink, position, (

SELECT MAX( position )
FROM page_mainpages AS sub
WHERE sub.position < position
AND sub.parentid = parentid
) AS prevpage, (

SELECT MIN( position )
FROM page_mainpages AS sub
WHERE sub.position > position
AND sub.parentid = parentid
) AS nextpage
FROM page_mainpages
WHERE id = parentid
OR parentid !=0
AND parentid NOT
IN (

SELECT id
FROM page_mainpages
)
ORDER BY pagetitle

Wenn ich das ganze in PHPMyAdmin ausführe erhalte ich das gewünschte Ergebnis. In PHP, erhalte ich entweder eine weise Seite (Ich denke wenn die maximale execution time von 30 Sekunden erreicht ist) oder ich bekomme die Meldung dass die 128 MB Arbeitsspeicher überschritten sind.

Der Clou:

Lasse ich id = parentid OR im Where Statement weg, funktioniert auch in PHP alles bestens.

Weitere Daten:

MySQL Server: - 5.6.10 - MySQL Community Server (GPL) (64bit Windows)
Webserver: - Microsoft-IIS/8.0
PHP: 5.4.9
Verbindung über mysqli

Ich bin gerade echt am verzweifeln, würde mich über eure Hilfe sehr freuen.

Edit:
Ersetze ich das Rote mit TRUE AND ist das selbe Phänomen vorhanden.

Edit 2:

Tabellenstruktur und Testdaten:

Code:
--
-- Tabellenstruktur für Tabelle `page_mainpages`
--

CREATE TABLE IF NOT EXISTS `page_mainpages` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parentid` int(10) unsigned NOT NULL DEFAULT '0',
  `pagetitle` varchar(150) NOT NULL,
  `linktitle` varchar(50) NOT NULL,
  `authorid` int(11) NOT NULL,
  `creationtime` datetime NOT NULL,
  `updatetime` datetime NOT NULL,
  `published` tinyint(4) NOT NULL DEFAULT '0',
  `publicationlevel` tinyint(4) NOT NULL DEFAULT '0',
  `islink` tinyint(4) NOT NULL DEFAULT '0',
  `position` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=56 ;


--
-- Daten für Tabelle `page_mainpages`
--

INSERT INTO `page_mainpages` (`id`, `parentid`, `pagetitle`, `linktitle`, `authorid`, `creationtime`, `updatetime`, `published`, `publicationlevel`, `islink`, `position`) VALUES
(3, 0, 'Der Lange Titel', 'Test 1234', 0, '2013-05-09 20:24:00', '2013-05-13 21:51:29', 1, 1, 1, 12),
(4, 0, 'Der Lange Titel 2', 'Der Lange Titel 2', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 1, 0, 6),
(8, 0, 'sdfsdfsdfsdfdsf', 'sadfsdfsdfsdf', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 1, 1, 4),
(9, 9, 'blibla', 'blibla', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 1, 1, 9),
(18, 0, 'Die lange Beschreiung des Testa', 'Test', 0, '2013-05-11 03:47:03', '2013-05-13 21:51:46', 1, 1, 1, 5),
(20, 0, 'sdgdfsgsfgfsd', 'gsdfgdfsgdsfgfg', 0, '2013-05-13 04:59:49', '2013-05-13 18:28:15', 1, 1, 1, 8),
(55, 3, 'Hallo Welt Titel der Seite', 'Hallo Welt', 2, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 107, 1, 16);
 
Werbung:
Du musst die Klammerung anders setzen.

Code:
SELECT id, parentid, pagetitle, linktitle, authorid, creationtime, updatetime, published, publicationlevel, islink, position, (

SELECT MAX( position )
FROM page_mainpages AS sub
WHERE sub.position < position
AND sub.parentid = parentid
) AS prevpage, (

SELECT MIN( position )
FROM page_mainpages AS sub
WHERE sub.position > position
AND sub.parentid = parentid
) AS nextpage
FROM page_mainpages
WHERE (
 id = parentid
 OR parentid !=0
)
AND parentid NOT
IN (

SELECT id
FROM page_mainpages
)
ORDER BY pagetitle

Siehst Du den Unterschied? :)
 
Hallo Threadi,

nein, dass ist schon beabsichtigt so.

Ich möchte Folgende Datensätze bekommen

1. parentid = id
2. parentid != 0 und 3. parentid exestiert nicht in id

Wie gesagt, in PhpMyAdmin funktioniert es ja.

Oder meintest du eine andere Klammer? Ich habe nur (Exp1 OR Exp2) AND EXP3 gefunden.

Was ich brauche ist

(EXP1) OR (EXP2 AND EXP3)

Vielen Dank für deine Hilfe.
 
Werbung:
Gut zu wissen wie Du es genau haben willst. Wie gesagt: setz die Klammerung richtig.

Code:
SELECT id, parentid, pagetitle, linktitle, authorid, creationtime, updatetime, published, publicationlevel, islink, position, (

SELECT MAX( position )
FROM page_mainpages AS sub
WHERE sub.position < position
AND sub.parentid = parentid
) AS prevpage, (

SELECT MIN( position )
FROM page_mainpages AS sub
WHERE sub.position > position
AND sub.parentid = parentid
) AS nextpage
FROM page_mainpages
WHERE 
 id = parentid
 OR (
  parentid !=0
  AND parentid NOT
  IN (
   SELECT id
   FROM page_mainpages
  )
)
ORDER BY pagetitle

Tipp: Einrückung hilft auch bei der Übersichtlichkeit ;)

Problem was ich hierbei noch sehe:
Du hast mehrere Subselects. Das verlangsamt das Statement. Vor allem das Subselect im WHERE ist doch sehr allgemein gefasst. Wenn die Datenbanktabelle sehr groß ist, wird es zwangsläufig langsamer werden, selbst wenn Du die Indizes passend setzt. Musst Du das wirklich alles in einem Statement abfackeln?
 
Hallo Threadi,

leider ändern die Klammern nichts. In PhpMyAdmin funktioniert das ganze noch, sobald PHP ins Spiel kommt, hängt sich alles auf. Wie gesagt entferne ich id = parentid funktioniert auch wieder alles in PHP. Ich weiß nicht woran das liegen könnte.

Der Grund für einen zusammengefassten Query, ist der, dass ich sozusagen alle verweisten Einträge finden möchte (Diese entsprechen den 3 Regeln im Where Statement). Previos und Nextpage benötige ich allerdings auch bei verweisten Seiten. Das ganze wird jedoch nur auf einer (seltenen) Seite im Backend aufgerufen.

Gruß
 
Sorry, dass ich deine Zeit verschwendet habe... Ich hatte eine endlose Rekrusion...

Das schlimme daran:
Der IIS hat keine Änderungen übernommen. Ich habe direkt nach dem Query ein die("Test") gesetzt. Der ist nie dahin gekommen. Dass ich in der View am Schluss noch einen Rekrusionsfehler hatte, wäre ich nie darauf gekommen.

Heute habe ich den Root neugestartet, und siehe da, die Fehlermeldung ist da...
 
Werbung:
Zurück
Oben