0

I want to know if there is a way with MySQL request to get the table names in which a column value is equal to a particular one.

For example I have 3 tables :

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

Let's say I want to get the classroom in which there is a student whose name is 'Bob'. I want to get, as response

['Classroom1','Classroom3']

Is there anything like that in MySQL ?

Thanks in advance !!

EDIT

Sorry, I might have used a wrong word. What I meant was that I want to know if there is a way with MySQL request to get the table names in which a cell value is equal to a particular one.

Megaman
  • 149
  • 12

3 Answers3

1

Check this question

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

You can also use normal functions like (Distinct,Count,etc). Cheers!

l.g.karolos
  • 1,131
  • 1
  • 10
  • 25
1

I am adding another answer if someone needs the first one

So first you have to find the table match the column you want.

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

Now, you want to search each table with the specific column for a specific value inside.

You need to create a procedure iterating over these tables and selecting by your 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();

See how to create a procedure here

See how to loop inside a procedure here

See how the cursors in mysql works here

l.g.karolos
  • 1,131
  • 1
  • 10
  • 25
0

Thanks to l.g.karolos I was able to get what I wanted. Here is the 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$$

With getStudentResults declares as

    CREATE TEMPORARY TABLE IF NOT EXISTS getStudentResults (
   classroom_name VARCHAR(255),
   student_number INT DEFAULT 0,
   total_student_number INT DEFAULT 0
 );
Megaman
  • 149
  • 12