RÉSOLU - MySql ensembles imbriqués - Tous les "feuilles"

  • righteous_trespasser
  • Scuffle
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Mar 12, 2007
  • Messages: 6228
  • Loc: South-Africa
  • Status: Offline

Message Juin 29th, 2010, 7:07 am

J'ai le tableau suivant:

MYSQL Code: [ Select ]
CREATE TABLE task(
id INT(11) PRIMARY KEY NOT NULL REFERENCES `data`(id),
name VARCHAR(255) NOT NULL,
description TEXT NULL,
start_date DATETIME NULL,
end_date DATETIME NULL,
lft INT(11) NOT NULL,
rgt INT(11) NOT NULL
) ENGINE=InnoDB;
  1. CREATE TABLE task(
  2. id INT(11) PRIMARY KEY NOT NULL REFERENCES `data`(id),
  3. name VARCHAR(255) NOT NULL,
  4. description TEXT NULL,
  5. start_date DATETIME NULL,
  6. end_date DATETIME NULL,
  7. lft INT(11) NOT NULL,
  8. rgt INT(11) NOT NULL
  9. ) ENGINE=InnoDB;


et avec ce tableau, j'ai les données suivantes à titre d'exemple:

Attachments:
data.gif

Les mots sont les noms et le rouge montre la LFT "et" RGT "valeurs.

Pour trouver tous les "feuilles" noeuds-je exécuter la requête suivante:

MYSQL Code: [ Select ]
SELECT node.name
FROM task AS parent, task AS node
JOIN `data` ON node.id = `data`.id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.rgt = (node.lft + 1)
AND `data`.status = 'A'
GROUP BY node.name
ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC;
  1. SELECT node.name
  2. FROM task AS parent, task AS node
  3. JOIN `data` ON node.id = `data`.id
  4. WHERE node.lft BETWEEN parent.lft AND parent.rgt
  5. AND node.rgt = (node.lft + 1)
  6. AND `data`.status = 'A'
  7. GROUP BY node.name
  8. ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC;


Avec que je recevrais le texte suivant à la suite:
"Images" Trouver "Signature", "blog", "User" et "contenu" Load.

Chacune de ces tâches »ont un statut de« A »(pour Active) en ce moment (qui se trouve dans le« données »de table), mais disons" blog "et" Utilisateur "maintenant les deux ont un statut de" F »(pour les produits finis). Je voudrais ensuite de voir ce qui suit à la suite:
"Images" Trouver "Signature", "charger les modules", "Contenu" Load.
Je voudrais donc trouver tous les nœuds de feuille, mais si tous les nœuds dans un noeud d'un statut de "F", Id voudrais voir ce nœud et non pas les enfants.

Est-il possible? Et si c'est le savez-vous comment le faire parce que je suis perdu.
Let's leave all our *plum* where it is and go live in the jungle ...
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juin 29th, 2010, 7:07 am

  • SpooF
  • ٩๏̯͡๏۶
  • Bronze Member
  • Avatar de l’utilisateur
  • Inscription: Mai 22, 2004
  • Messages: 3415
  • Loc: Richland, WA
  • Status: Offline

Message Juin 29th, 2010, 7:23 am

Pouvez-vous exporter votre table avec les données? Ill jouer avec cela un peu, mais je veux m'assurer que j'ai les données correctes.

Les valeurs de nœud enfant à gauche et à droite sera toujours entre les pare pas à gauche et à droite, exact?
#define NULL (::rand() % 2)
  • righteous_trespasser
  • Scuffle
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Mar 12, 2007
  • Messages: 6228
  • Loc: South-Africa
  • Status: Offline

Message Juin 29th, 2010, 7:36 am

Bien sûr, voici le code:

MYSQL Code: [ Select ]
CREATE TABLE task(
id INT(11) PRIMARY KEY NOT NULL REFERENCES `data`(id),
name VARCHAR(255) NOT NULL,
description TEXT NULL,
start_date DATETIME NULL,
end_date DATETIME NULL,
lft INT(11) NOT NULL,
rgt INT(11) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE `data`(
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
created_date DATETIME NULL,
last_modified_date DATETIME NULL,
type VARCHAR(255) NOT NULL,
status CHAR(1) NOT NULL DEFAULT 'P',
url VARCHAR(255) NOT NULL,
view_count INT(11) NOT NULL DEFAULT 0
) ENGINE=InnoDB;
INSERT INTO `data` VALUES(1,NOW(),NOW(),'Task','A','project',0),(2,NOW(),NOW(),'Task','A','design',0),(3,NOW(),NOW(),'Task','A','find_images',0),(4,NOW(),NOW(),'Task','A','sign_off',0),(5,NOW(),NOW(),'Task','A','develop',0),(6,NOW(),NOW(),'Task','A','load_modules',0),(7,NOW(),NOW(),'Task','A','blog',0),(8,NOW(),NOW(),'Task','A','user',0),(9,NOW(),NOW(),'Task','A','load_content',0);
INSERT INTO task VALUES(1,'Project',null,null,null,1,18),(2,'Design',null,null,null,2,7),(3,'Find Images',null,null,null,3,4),(4,'Sign Off',null,null,null,5,6),(5,'Develop',null,null,null,8,17),(6,'Load Modules',null,null,null,9,14),(7,'Blog',null,null,null,10,11),(8,'User',null,null,null,12,13),(9,'Load Content',null,null,null,15,16);
  1. CREATE TABLE task(
  2. id INT(11) PRIMARY KEY NOT NULL REFERENCES `data`(id),
  3. name VARCHAR(255) NOT NULL,
  4. description TEXT NULL,
  5. start_date DATETIME NULL,
  6. end_date DATETIME NULL,
  7. lft INT(11) NOT NULL,
  8. rgt INT(11) NOT NULL
  9. ) ENGINE=InnoDB;
  10. CREATE TABLE `data`(
  11. id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  12. created_date DATETIME NULL,
  13. last_modified_date DATETIME NULL,
  14. type VARCHAR(255) NOT NULL,
  15. status CHAR(1) NOT NULL DEFAULT 'P',
  16. url VARCHAR(255) NOT NULL,
  17. view_count INT(11) NOT NULL DEFAULT 0
  18. ) ENGINE=InnoDB;
  19. INSERT INTO `data` VALUES(1,NOW(),NOW(),'Task','A','project',0),(2,NOW(),NOW(),'Task','A','design',0),(3,NOW(),NOW(),'Task','A','find_images',0),(4,NOW(),NOW(),'Task','A','sign_off',0),(5,NOW(),NOW(),'Task','A','develop',0),(6,NOW(),NOW(),'Task','A','load_modules',0),(7,NOW(),NOW(),'Task','A','blog',0),(8,NOW(),NOW(),'Task','A','user',0),(9,NOW(),NOW(),'Task','A','load_content',0);
  20. INSERT INTO task VALUES(1,'Project',null,null,null,1,18),(2,'Design',null,null,null,2,7),(3,'Find Images',null,null,null,3,4),(4,'Sign Off',null,null,null,5,6),(5,'Develop',null,null,null,8,17),(6,'Load Modules',null,null,null,9,14),(7,'Blog',null,null,null,10,11),(8,'User',null,null,null,12,13),(9,'Load Content',null,null,null,15,16);
Let's leave all our *plum* where it is and go live in the jungle ...
  • righteous_trespasser
  • Scuffle
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Mar 12, 2007
  • Messages: 6228
  • Loc: South-Africa
  • Status: Offline

Message Juin 29th, 2010, 7:47 am

SpooF a écrit:
Les valeurs de nœud enfant à gauche et à droite sera toujours entre les pare pas à gauche et à droite, exact?

Oui, j'ai eu l'exemple de ici .
Let's leave all our *plum* where it is and go live in the jungle ...
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juin 29th, 2010, 11:17 am

J'ai vu ce fil il ya quelques heures et était perplexe. Je pensais à des sous-requêtes, mais ne savez pas où aller avec elle. Après avoir pris quelques repas je pense avoir quelque chose de bien.

SQL Code: [ Select ]
SELECT node.name
FROM task AS parent, task AS node
JOIN `data` ON node.id = `data`.id
WHERE
  (
   node.lft BETWEEN parent.lft AND parent.rgt
   AND node.rgt = (node.lft + 1)
   AND `data`.STATUS = 'A'
  )
  OR
  (
   node.lft IN (SELECT lft - 1 AS _lft FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
   AND node.rgt IN (SELECT rgt + 1 AS _rgt FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
  )
GROUP BY node.name
ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC
  1. SELECT node.name
  2. FROM task AS parent, task AS node
  3. JOIN `data` ON node.id = `data`.id
  4. WHERE
  5.   (
  6.    node.lft BETWEEN parent.lft AND parent.rgt
  7.    AND node.rgt = (node.lft + 1)
  8.    AND `data`.STATUS = 'A'
  9.   )
  10.   OR
  11.   (
  12.    node.lft IN (SELECT lft - 1 AS _lft FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
  13.    AND node.rgt IN (SELECT rgt + 1 AS _rgt FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
  14.   )
  15. GROUP BY node.name
  16. ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC
Strong with this one, the sudo is.
  • righteous_trespasser
  • Scuffle
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Mar 12, 2007
  • Messages: 6228
  • Loc: South-Africa
  • Status: Offline

Message Juin 29th, 2010, 11:15 pm

Excellent. Merci joebert, Merci frauduleux. Résolu.
Let's leave all our *plum* where it is and go live in the jungle ...
  • righteous_trespasser
  • Scuffle
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Mar 12, 2007
  • Messages: 6228
  • Loc: South-Africa
  • Status: Offline

Message Juin 30th, 2010, 1:55 am

Okay, peut-être pas complètement. Je viens de vérifier ce un peu plus loin. Si je termine "blog", "Utilisateur", modules de chargement "," charger le contenu "," Trouver des images »et« Signature », alors je devrais être laissés avec" Design "et" développer ". Cependant, je suis à gauche avec "Design", "Développer" et les modules de charge ".

J'ai changé la requête à la suite de régler cette question:
MYSQL Code: [ Select ]
SELECT node.id,node.name
FROM task AS parent, task AS node
JOIN `data` ON node.id = `data`.id
WHERE
  (
   node.lft BETWEEN parent.lft AND parent.rgt
   AND node.rgt = (node.lft + 1)
   AND `data`.`status` = 'A'
  )
  OR
  (
   node.lft IN (SELECT lft - 1 AS _lft FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
   AND node.rgt IN (SELECT rgt + 1 AS _rgt FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
   AND `data`.`status` != 'F'
  )
GROUP BY node.name
ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC
  1. SELECT node.id,node.name
  2. FROM task AS parent, task AS node
  3. JOIN `data` ON node.id = `data`.id
  4. WHERE
  5.   (
  6.    node.lft BETWEEN parent.lft AND parent.rgt
  7.    AND node.rgt = (node.lft + 1)
  8.    AND `data`.`status` = 'A'
  9.   )
  10.   OR
  11.   (
  12.    node.lft IN (SELECT lft - 1 AS _lft FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
  13.    AND node.rgt IN (SELECT rgt + 1 AS _rgt FROM task LEFT JOIN `data` ON task.id = `data`.id WHERE `data`.STATUS = 'F')
  14.    AND `data`.`status` != 'F'
  15.   )
  16. GROUP BY node.name
  17. ORDER BY DATE(`data`.created_date),(COUNT(parent.name) - 1) DESC

Il fonctionne avec cela aussi maintenant.

Merci beaucoup encore une fois les gars.
Let's leave all our *plum* where it is and go live in the jungle ...

Afficher de l'information

  • Total des messages de ce sujet: 7 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 140 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC