Ordner/Bilder Tree suche mit SQL

Jetzt muss ich selber testen.
Hast du ein CREATE TABLE-Script sowie ein INSERT-SCRIPT, damit ich nich alles aus diesem Thread zusammensuchen muss?
 
Code:
--
-- Tabellenstruktur für Tabelle `nav`
--

CREATE TABLE IF NOT EXISTS `nav` (
  `id` int(11) NOT NULL auto_increment,
  `was` enum('ordner','bild') NOT NULL,
  `name` varchar(222) NOT NULL,
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Daten für Tabelle `nav`
--

INSERT INTO `nav` (`id`, `was`, `name`, `lft`, `rgt`) VALUES
(1, 'ordner', 'Deutsch', 1, 20),
(2, 'ordner', 'Deutschland', 2, 7),
(3, 'bild', 'Bild1', 3, 4),
(4, 'bild', 'Bild2', 5, 6),
(5, 'bild', 'Deutsches', 8, 9),
(6, 'ordner', 'Elefant', 10, 19),
(7, 'bild', 'Klein', 11, 12),
(8, 'ordner', 'Andere', 13, 18),
(9, 'bild', 'Groesser', 14, 15),
(10, 'bild', 'Am Groessten', 16, 17);
 
Alles klar. Jetzt versteh ich auch dein Aufbau.
Du kannst ganz elegant die Quellen bereits schon entsprechend ausählen. Alle in der Parent-Quelle müssen 'Ordner' sein. Alle in Node-Quelle müssen 'Bild' sein.
SQL:
SELECT 
	node.*
FROM 
	(SELECT * FROM nav WHERE was='bild')  AS node
	INNER JOIN (SELECT * FROM nav WHERE was='ordner') AS parent
		ON node.lft BETWEEN parent.lft AND parent.rgt
WHERE
	parent.name ='Deutschland'
 
Zuletzt bearbeitet von einem Moderator:
GANAU das wollte ich machen! Ich habe die suche noch etwas erweitert. Mann kann noch nach Längen und Breitengrad suchen ;) Hier der neue Insert Code:

Neuer Insert CODE:
Code:
--
-- Tabellenstruktur für Tabelle `nav`
--

CREATE TABLE IF NOT EXISTS `nav` (
  `id` int(11) NOT NULL auto_increment,
  `was` enum('ordner','bild') NOT NULL,
  `name` varchar(222) NOT NULL,
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  `lat` float NOT NULL,
  `lng` float NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Daten für Tabelle `nav`
--

INSERT INTO `nav` (`id`, `was`, `name`, `lft`, `rgt`, `lat`, `lng`) VALUES
(1, 'ordner', 'Deutsch', 1, 20, 0, 0),
(2, 'ordner', 'Deutschland', 2, 7, 0, 0),
(3, 'bild', 'Bild1', 3, 4, 47.4986, 8.73413),
(4, 'bild', 'Bild2', 5, 6, 47.9899, 7.85522),
(5, 'bild', 'Deutsches', 8, 9, 46.9203, 7.44873),
(6, 'ordner', 'Elefant', 10, 19, 0, 0),
(7, 'bild', 'Klein', 11, 12, 48.7779, 9.17908),
(8, 'ordner', 'Andere', 13, 18, 0, 0),
(9, 'bild', 'Groesser', 14, 15, 48.4656, 7.93762),
(10, 'bild', 'Am Groessten', 16, 17, 49.4824, 8.49243);

Welches Bild ist am nächsten von lat und lan
Die SQL Abfrage mit lat = 48.69096039 und lng = 6.19628906
Code:
SELECT 
    node.*
FROM 
    (   SELECT 
            id, was, name, lft, rgt, 
                ( 6371 * acos( cos( radians(48.69096039) ) 
                * cos( radians( lat ) ) 
                * cos( radians( lng ) 
                - radians(6.19628906) ) 
                + sin( radians(48.69096039) ) 
                * sin( radians( lat ) ) ) ) AS distanz
        FROM 
           nav 
        WHERE 
           was='bild'
     )  AS node
    INNER JOIN (SELECT * FROM nav WHERE was='ordner') AS parent
        ON node.lft BETWEEN parent.lft AND parent.rgt
WHERE
    parent.name ='Deutsch'
ORDER BY node.distanz ASC

Geniale sache!! Besten Dank nochmals! :p wauuu:p
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück