Je veux savoir s'il existe un moyen avec la requête MySQL pour obtenir les noms de table dans lesquels une valeur de colonne est égale à une valeur particulière.

Par exemple j'ai 3 tables:

Classroom1             Classroom2              Classroom3
+------+                +------+                 +------+
| name |                | name |                 | name |
+------+                +------+                 +------+
| Bob  |                | Dan  |                 | Mike |
+------+                +------+                 +------+
| Mark |                | Noa  |                 | Bob  |
+------+                +------+                 +------+

Disons que je veux avoir la classe dans laquelle se trouve un élève dont le nom est «Bob». Je veux obtenir, comme réponse

['Classroom1','Classroom3']

Y a-t-il quelque chose comme ça dans MySQL?

Merci d'avance !!

MODIFIER

Désolé, j'ai peut-être utilisé un mauvais mot. Ce que je voulais dire, c'est que je veux savoir s'il existe un moyen avec la requête MySQL d'obtenir les noms de table dans lesquels une valeur de cellule est égale à une valeur particulière.

0
Megaman 24 nov. 2017 à 12:48

3 réponses

Meilleure réponse

Grâce à l.g.karolos, j'ai pu obtenir ce que je voulais. Voici le code:

DELIMITER $$


DROP PROCEDURE IF EXISTS getStudentFromClassroom$$
CREATE PROCEDURE getStudentFromClassroom(student_name VARCHAR(255))
BEGIN
  DECLARE done INT DEFAULT FALSE;

  DECLARE _tablename VARCHAR(255);
  DECLARE _columnname VARCHAR(255) DEFAULT 'device';
  DECLARE _columnNameToFind VARCHAR(255) ;


   DECLARE cur1 CURSOR FOR SELECT 
                             CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name,
                            COLUMN_NAME AS column_name 
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE COLUMN_NAME IN ('YOUR_COLUMN_NAME')
                                AND TABLE_SCHEMA='YOUR_TABLE';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO _tablename;

    IF done THEN
      LEAVE read_loop;
    END IF;

    SET @s = CONCAT('SELECT @student_number := COUNT(DISTINCT ', _columnname,') ',_tablename,' FROM ', _tablename, ' WHERE ', _columnname,' = \'', student_name,'\'');
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SET @s = CONCAT('SELECT @ total_student_number := COUNT(DISTINCT ', _columnname,') ',_tablename,' FROM ', _tablename);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    INSERT INTO getStudentResults VALUES (_tablename,@student_number,@total_student_number);

  END LOOP;

  CLOSE cur1;

END$$

Avec getStudentResults déclare comme

    CREATE TEMPORARY TABLE IF NOT EXISTS getStudentResults (
   classroom_name VARCHAR(255),
   student_number INT DEFAULT 0,
   total_student_number INT DEFAULT 0
 );
0
Megaman 28 nov. 2017 à 14:18

J'ajoute une autre réponse si quelqu'un a besoin de la première

Vous devez donc d'abord trouver le tableau correspondant à la colonne souhaitée.

SELECT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('COLUMN_TO_FIND')
        AND TABLE_SCHEMA='YOUR_SCHEMA';

Maintenant, vous voulez rechercher chaque table avec la colonne spécifique pour une valeur spécifique à l'intérieur.

Vous devez créer une procédure itérant sur ces tables et sélectionnant par votre clause

DROP PROCEDURE IF EXISTS findName;

DELIMITER //

CREATE PROCEDURE findName()
BEGIN
  DECLARE _tablename VARCHAR(255);
  DECLARE _columnname VARCHAR(255);
  DECLARE _columnNameToFind VARCHAR(255) DEFAULT 'bob';

  DECLARE cur1 CURSOR FOR SELECT 
                             CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name,
                            COLUMN_NAME AS column_name 
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE COLUMN_NAME IN ('YOUR_COLUMN_NAME')
                                AND TABLE_SCHEMA='YOUR_TABLE';

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO _tablename, _columnname;

    SET @s = CONCAT('SELECT * FROM ', _tablename, ' WHERE ', _columnname =_columnNameToFind);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

  END LOOP;

  CLOSE cur1;
END//

DELIMITER ;

CALL findName();

Découvrez comment créer une procédure ici

Découvrez comment boucler dans une procédure ici

Découvrez le fonctionnement des curseurs dans mysql ici

1
l.g.karolos 24 nov. 2017 à 11:12

Vérifiez cette question

SELECT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('COLUMN_TO_FIND')
        AND TABLE_SCHEMA='YOUR_SCHEMA';

Vous pouvez également utiliser des fonctions normales telles que (Distinct, Count, etc.). À votre santé!

1
l.g.karolos 24 nov. 2017 à 10:17
47470506