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 21-11-2009, 00:02
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard INSERT-Query mit Bezug auf Spalte

Ich bastle mit NestedSets herum und möchte gerne einen neuen Knoten einfügen. Ein Baum besitzt bei mir mehrere Wurzeln, d.h. der neue Knoten soll als neue Wurzel angelegt werden. Das heißt, der linke Wert des neuen Knotens besitzt den Wert MAX(rgt)+1, der rechte Wert MAX(rgt)+2. Das kann ich auch ganz fein in einer INSERT-Query mit Subselect verpacken und sieht dann zum Beispiel so aus:
Code:
insert into nodes set
  lft=(select max(rgt) from nodes as n)+1,
  rgt=(select max(rgt) from nodes as n)+2,
  data=...
Das ist soweit in Ordnung und klappt auch wunderbar.
Die Frage ist jetzt, muss ich an dieser Stelle wirklich zwei Subselects nutzen, oder kann ich den Wert für rgt nicht direkt auf lft+1 setzen. Ich habe das in MySQL getestet und das klappt, wenn ich erst lft und anschließend rgt setze, d.h. die Reihenfolge ist entscheidend. Gilt dies denn immer? Im Grunde fehlt mir nur das kleine Schnippselchen Dokumentation, welches mir sagt, dass die Auswertungsreihenfolge immer von links nach rechts ist und rgt definitiv den Wert lft+1 annimmt.
Kann mir da jemand von den SQL-Profis etwas mehr zu sagen?
Mit Zitat antworten
  #2 (permalink)  
Alt 21-11-2009, 00:51
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,

mit INSERT ... SELECT kannst du das ganz ohne Subselects lösen:

Code:
insert into nodes (lft, rgt)
select max(rgt) + 1, max(rgt) + 2
from nodes;
Gruß,

Amica
Mit Zitat antworten
  #3 (permalink)  
Alt 21-11-2009, 01:35
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Da hast du recht, auch eine nette alternative. Ich nutze die Zend_Db-Klassen und würde da gerne direkt die insert-Methode nutzen, gegen das Subselect habe ich also nichts. Weißt du, ob die Ausführungsreihenfolge der Query immer von links nach rechts ist?
Mit Zitat antworten
  #4 (permalink)  
Alt 21-11-2009, 06:24
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 PHP-Desaster Beitrag anzeigen
Weißt du, ob die Ausführungsreihenfolge der Query immer von links nach rechts ist?
Das kann ich dir leider nicht sagen und selbst wenn, wüsste ich nicht, ob das in der nächsten Version noch genau so ist.

Wenn dir das INSERT ... SELECT nicht zusagt, könntest du immer noch einen BEFORE INSERT Trigger definieren, der NEW.rgt auf NEW.lft + 1 setzt und im INSERT-Statement nur lft setzen.
Mit Zitat antworten
  #5 (permalink)  
Alt 22-11-2009, 16:05
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ich habe mir das jetzt länger durch den Kopf gehen lassen und werde bei meiner jetzigen Lösung mit den zwei Subselects bleiben. Ein Trigger ist mir für den Spezialfall "Hinzufügen einer neuen Wurzel" zu viel tamtam und mich auf die Ausführungsreihenfolge verlassen ist zu naiv. Vielen Dank für deine Alternativvorschläge
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
Query mit INSERT ... NOT IN Pust SQL / Datenbanken 3 11-10-2008 20:01
Werte aus Query in einer Spalte zusammenfassen. toshen SQL / Datenbanken 2 04-04-2007 16:33
kein INSERT weil Spalte nicht existiert MTCook SQL / Datenbanken 8 11-12-2006 15:47
daten insert on eine andere tb.spalte kasIQ SQL / Datenbanken 8 16-12-2005 01:02
insert-query funzt net!!!! Avirell PHP Developer Forum 5 30-11-2003 13:09

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 15:33 Uhr.