![](/img/trans.png)
[英]MYSQL: WHERE NOT LIKE '%(SELECT column_name FROM table_name)%'
[英]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';
您還可以使用常規功能,例如( Distinct
, Count
等)。 干杯!
如果有人需要第一個答案,我會添加另一個答案
因此,首先您必須找到與所需列匹配的表。
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.