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 Bewertung: Bewertung: 9 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 22-06-2009, 12:37
Beyond
 Registrierter Benutzer
Links : Onlinestatus : Beyond ist offline
Registriert seit: Jan 2004
Ort: München
Beiträge: 60
Beyond ist zur Zeit noch ein unbeschriebenes Blatt
Question veraltete Referenzen finden.

Hallo,

ich stehe grade total auf dem Schlauch wg. eines vermutlich
sehr trivialen Problems. Ich will veraltete Referenzen aus
einer Datenbank entfernen, bzw. zuerst mal finden.
Das ganze ist in EINER Tabelle:
  • id | parent
    ------------
    01 | 00
    02 | 01
    04 | 03
    05 | 01

"id" ist der index, "parent" ist die Referenz auf ein übergeordnetes Element
ähnlich einer Baumstruktur. Nun kann es sein, dass das übergeordnete Element nicht mehr existert - wie hier "03".
Ich suche nun den SQL-String, der mir als Ergebnis den Datensatz "04" liefern würde. Bin wohl zu dumm!

Habe schon es mit Joins versucht a la
Code:
SELECT t1.id FROM TABELLE t1 INNER JOIN TABELLE t2 ON t1.id=t2.id WHERE t2.parent != t1.id
was aber Unsinn ist und nicht funktioniert.
__________________
Gruss,
Stefan
Mit Zitat antworten
  #2 (permalink)  
Alt 22-06-2009, 12:53
Benutzerbild von Berni Berni
  OWNER
Links : Onlinestatus : Berni ist offline
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.306
Blog-Einträge: 6
Berni befindet sich auf einem aufstrebenden Ast
Standard

Schau dir mal die Subselects an
ala : select * from x where id not in (select * from yyyy where xxx)

*war doch so... *
__________________

php-Entwicklung | ebiz-consult.de
PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
die PHP Marktplatz-Software | ebiz-trader.de
Mit Zitat antworten
  #3 (permalink)  
Alt 22-06-2009, 13:29
Beyond
 Registrierter Benutzer
Links : Onlinestatus : Beyond ist offline
Registriert seit: Jan 2004
Ort: München
Beiträge: 60
Beyond ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Berni Beitrag anzeigen
*war doch so... *
war auch so

Danke! So ging es!

so sieht in meinem fall der richtige SQL String aus:
(auch wenn das ausser mir wohl keinem hilft)
$sql = 'SELECT * FROM `pcm_pages` WHERE page_parent NOT IN (SELECT page_id FROM `pcm_pages` WHERE 1) AND page_parent != 0';
__________________
Gruss,
Stefan
Mit Zitat antworten
  #4 (permalink)  
Alt 22-06-2009, 14:09
Benutzerbild von Berni Berni
  OWNER
Links : Onlinestatus : Berni ist offline
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.306
Blog-Einträge: 6
Berni befindet sich auf einem aufstrebenden Ast
Standard

hey! ich kann noch SQL!
__________________

php-Entwicklung | ebiz-consult.de
PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
die PHP Marktplatz-Software | ebiz-trader.de
Mit Zitat antworten
  #5 (permalink)  
Alt 22-06-2009, 14:39
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Ich auch:
Code:
SELECT a.page_id AS haengender_knoten
  FROM `pcm_pages` AS a
  LEFT OUTER JOIN `pcm_pages` AS b
 ON a.page_parent = b.page_id
  WHERE b.page_id IS NULL AND a.page_parent <> 0
__________________
Wir werden alle sterben
Mit Zitat antworten
  #6 (permalink)  
Alt 22-06-2009, 14:48
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Ich finde combie's Lösung attaktiver. ;-)
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #7 (permalink)  
Alt 22-06-2009, 14:55
Benutzerbild von Berni Berni
  OWNER
Links : Onlinestatus : Berni ist offline
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.306
Blog-Einträge: 6
Berni befindet sich auf einem aufstrebenden Ast
Standard

ich auch
__________________

php-Entwicklung | ebiz-consult.de
PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
die PHP Marktplatz-Software | ebiz-trader.de
Mit Zitat antworten
  #8 (permalink)  
Alt 22-06-2009, 17:30
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Danke für die Blumen.

Aber:
1. überlassen wir mal dem EXPLAIN, welche die schönere Abfrage ist.
2. ist das Problem schon unmöglich!

In einem Baum darf es keine einsam in der Luft hängenden Äste geben. Auch muß rekursiv gelöscht werden, es gibt ja evtl.noch Unteräste

Das erledigt diese Struktur:
Code:
CREATE TABLE IF NOT EXISTS `baum` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `parent` (`parent`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

ALTER TABLE `baum`
  ADD CONSTRAINT `baum_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `baum` (`id`) ON DELETE CASCADE;
__________________
Wir werden alle sterben
Mit Zitat antworten
  #9 (permalink)  
Alt 22-06-2009, 18:09
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Das ist korrekt. Aber das ist Beyond vermutlich egal.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #10 (permalink)  
Alt 23-06-2009, 09:31
Beyond
 Registrierter Benutzer
Links : Onlinestatus : Beyond ist offline
Registriert seit: Jan 2004
Ort: München
Beiträge: 60
Beyond ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Abraxax Beitrag anzeigen
Das ist korrekt. Aber das ist Beyond vermutlich egal.
Ist es natürlich NICHT
Allerdings gebe ich zu, ich werde noch ein paar Monate benötigen, um
die Routine von combie ansatzweise zu verstehen.

Code:
ALTER TABLE `baum`
  ADD CONSTRAINT `baum_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `baum` (`id`) ON DELETE CASCADE;
bedeutet wohl, dass er bei Löschvorgängen auch die Unteräste löscht?

Das ganze brauche ich für ein Content Management System (das ca. 5000te mittlerweile). Meine "Baumstruktur" habe ich mir selber zusammengeschustert.
PHP-Code:
              $sql=    "CREATE TABLE "TABLE_PAGES ." (
                page_id int(11) NOT NULL auto_increme
              page_parent int(11) NOT NULL default '0',
              page_level int(4) NOT NULL default '0',
              page_sort int(11) NOT NULL default '0',
              page_title varchar(255) NOT NULL default '',
                page_menu enum ('0','1') default '1',
              page_active enum ('0','1') default '1',
              PRIMARY KEY (page_id))"

Level=0 ist im Root. Sort ist dann die Sortierung in einer Ebene. Menu und
Active sind quasi nur Flags.
Das ganze funktioniert auch recht gut und schnell, nur hatte ich einen
Fehler nicht abgefangen, der mir dann Bäume nicht rekursiv gelöscht hatte
und deshalb dieser Fehler zustande kam.

Edit:
Bin doch dabei es eher zu verstehen, dank dieser Seite (Punkt 5.4.5 ff):
http://www.postgresql.org/files/docu...nstraints.html
__________________
Gruss,
Stefan

Geändert von Beyond (23-06-2009 um 09:37 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 23-06-2009, 10:30
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
ich werde noch ein paar Monate benötigen
Ist auch nur mit Wasser gekocht...


Zitat:
bedeutet wohl, dass er bei Löschvorgängen auch die Unteräste löscht?
Genau!

Ein paar Kleinigkeiten fallen mir da noch auf:
Zitat:
page_parent int(11) NOT NULL default '0',
Da es kein Element mit der ID 0 geben darf/kann ist default 0 nicht unbedingt angemessen. NULL (kein Vorgänger) wäre logischer als 0(ungültige ID)

Zitat:
page_level int(4) NOT NULL default '0',
Level ist doch sicher die Rekursionstiefe, oder?
Diese ergibt sich allerdings automatisch, gehört also zu den redundanten Daten. Das führt zu Mehraufwand(Sorgen) beim Verlegen der Äste.

Und hier mal ein "schlankes" JOIN Tutorial: Coding Horror: A Visual Explanation of SQL Joins
__________________
Wir werden alle sterben
Mit Zitat antworten
  #12 (permalink)  
Alt 24-06-2009, 10:05
Beyond
 Registrierter Benutzer
Links : Onlinestatus : Beyond ist offline
Registriert seit: Jan 2004
Ort: München
Beiträge: 60
Beyond ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Da es kein Element mit der ID 0 geben darf/kann ist default 0 nicht unbedingt angemessen. NULL (kein Vorgänger) wäre logischer als 0(ungültige ID)
Stimmt. Allerdings ist die 0 bei PHP ganz prakisch, weil sie als Boolean FALSE dienen kann. Ist aber wohl bei NULL auch so, oder?

Zitat:
Zitat von combie Beitrag anzeigen
Level ist doch sicher die Rekursionstiefe, oder?
Diese ergibt sich allerdings automatisch, gehört also zu den redundanten Daten. Das führt zu Mehraufwand(Sorgen) beim Verlegen der Äste.
Stimmt. Da ich den Level auch für die grafische Darstellung benötige, dachte ich es ist schneller diesen einmal beim Hinzufügen eines Astes in der DB zu speichern, als diesen bei jedem Aufruf zu ermitteln.
Habe ausserdem keine Ahnung wie ich diesen schnell aus Deiner Struktur (die übrigens vortrefflich rekursiv löscht, habs auspropiert) die Tiefe ermittle, ausser vielleicht so:
PHP-Code:
// aktuelles element = $page_id
$level 0;
$sql "SELECT page_parent FROM "TABLE_PAGES" WHERE page_id=$page_id";
$res $db->query($sql);
  while (
$rows mysql_fetch_array($res))
    {
    
$page_id $rows['page_id'];
    
$sql2 "SELECT page_parent FROM "TABLE_PAGES" WHERE page_id=$page_id";
    
$res $db->query($sql2);
    
$level ++;
    } 
Zitat:
Zitat von combie Beitrag anzeigen
Und hier mal ein "schlankes" JOIN Tutorial: Coding Horror: A Visual Explanation of SQL Joins
Danke! Gut gemacht.
__________________
Gruss,
Stefan
Mit Zitat antworten
  #13 (permalink)  
Alt 24-06-2009, 10:23
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Da ich den Level auch für die grafische Darstellung benötige,
Du brauchst für die Darstellung sicherlich noch mehr Daten, als nur die Tiefe. Also mußt du dich sowieso den Baum entlang hangeln. Dabei kannst du das Tiefen Problem gleich mit erledigen.

Bäume in DB Tabellen abzubilden ist immer mit "Nachteilen" verbunden. Das Parent/ID Konzept zwingt dazu, den Baum rekursiv zu durchlaufen. Das ist recht teuer.
"Nested Sets" sind beim Lesen billiger, weil die Rekursion quasi beim Eintragen schon vorweg genommen wurde. Wenn also hauptsächlich gelesen wird, dann sind Nested Sets günstiger.

Mein Favorit: Doctrine ORM for PHP - Hierarchical Data
__________________
Wir werden alle sterben
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
Imap Probleme - Veraltete Version? netsnake PHP Developer Forum 3 07-05-2007 20:53
referenzen 3DMax PHP Developer Forum 3 11-07-2006 19:23
Referenzierte Objekte -- Referenzen auf Referenzen notwendig warum? chansel0049 PHP Developer Forum 2 05-09-2005 07:55
Puretec - veraltete PHP-Version? Andi22 PHP Developer Forum 7 27-07-2004 20:11
Veraltete Informationen auf php generierten Seiten feschtus PHP Developer Forum 2 30-07-2001 13:53

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