Question

I have a MySQL table called EmpList. I want to use loop to bring result as I expected. For example EmpList having two columns,

    EmpNo   ReportingTo
    -------------------
    27      14
    68      14
    104     27
    105     27
    138     27
    139     68
    150     8
    151     8
    8       5

I am giving EmpNo as input to the query (ex: 14). I am expecting who are all ReportingTo EmpNo14 (ex:27,68 from table) and along with it subreportees if any (EmpNo who are all ReportingTo 27 and 68 (ex:104,105,138 ReportingTo 27 and 139 ReportingTo 68)). Finally I am trying to get result in a single column like

    EmpNo
    ------
    27
    68
    104
    105
    138
    139

I am trying to get result using query like this

SELECT EmpNo
FROM EmpList
WHERE ReportingTo IN (
  SELECT DISTINCT EmpNo
  FROM EmpList
  WHERE ReportingTo = 14
);

This query gives only one level (lowerlevel) result. Input value I am getting dynamically based on login.

Était-ce utile?

La solution

If you only need 2 levels - your solution is Union, but for more levels - there is no pretty way to do it in a single query. You can always try store procedure to retrieve this data.

for just 2 level information use

SELECT EmpNo     
   FROM EmpList 
   WHERE ReportingTo=14 
UNION ALL
SELECT EmpNo
   FROM EmpList
   WHERE ReportingTo IN
       (SELECT DISTINCT EmpNo
            FROM EmpList
            WHERE ReportingTo = 14
       ); 

And in Mysql is better to use join rather than a subquery, therefore the query should be

SELECT EmpNo
 FROM EmpList
 WHERE ReportingTo =14
UNION ALL
SELECT l1.EmpNo
 FROM EmpList l1 join EmpList l2 on l1.ReportingTo=l2.EmpNo
 WHERE l2.ReportingTo =14;

Autres conseils

Try this ...

DELIMITER $$

USE `Databasename`$$

DROP PROCEDURE IF EXISTS `getlist`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `getlist`(IN empid INT)
BEGIN
      DROP TABLE IF  EXISTS finallist1;
      DROP TABLE IF  EXISTS finallist2;
          CREATE TEMPORARY TABLE IF NOT EXISTS finallist1 (empnumber INT , isread BOOL );
          CREATE TEMPORARY TABLE IF NOT EXISTS finallist2 (empnumber INT  );
          INSERT INTO finallist1 (empnumber , isread ) SELECT EmpNo , FALSE  FROM EmpList WHERE reportingTo  IN (empid);
          INSERT INTO finallist2 SELECT EmpNo  FROM EmpList WHERE reportingTo  IN (empid);
          WHILE (SELECT COUNT(*) FROM finallist1 WHERE isread = FALSE > 0 )
          DO
          INSERT INTO finallist2 SELECT EmpNo  FROM EmpList WHERE reportingTo  IN (SELECT empnumber FROM finallist1 WHERE isread = FALSE);
          UPDATE finallist1 SET isread = TRUE WHERE empnumber IN (SELECT empnumber FROM finallist2);
          END WHILE ;
          SELECT empnumber FROM finallist2 ;
    END$$

DELIMITER ;

//Calling procedure

Call getlist(empid);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top