簡體   English   中英

從MySQL數據庫獲取表名稱,其中列名稱就像X值等於Y

[英]Get the table name(s) from MySQL database where column name is like X value is equal to Y

我想知道MySQL請求是否有一種方法來獲取表名稱,其中列值等於特定值。

例如我有3個表:

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

假設我想進入一個教室,其中有一個叫“鮑勃”的學生。 我想得到,作為回應

['Classroom1','Classroom3']

MySQL中有類似的東西嗎?

提前致謝 !!

編輯

抱歉,我可能使用了錯誤的單詞。 我的意思是我想知道MySQL請求是否有一種方法來獲取表名稱,其中單元格值等於特定值。

檢查這個問題

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

您還可以使用常規功能,例如( DistinctCount等)。 干杯!

如果有人需要第一個答案,我會添加另一個答案

因此,首先您必須找到與所需列匹配的表。

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

現在,您要在具有特定列的每個表中搜索內部的特定值。

您需要創建一個遍歷這些表並按子句選擇的過程

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();

在這里查看如何創建程序

這里查看如何在過程中循環

這里查看mysql中的游標如何工作

多虧了lgkarolos,我才能得到想要的東西。 這是代碼:

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$$

用getStudentResults聲明為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM