MySQL выбирает из всех таблиц с именем столбца

#mysql

#mysql

Вопрос:

Допустим, я запрашиваю это:

 SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like 'coduser';
  

он возвращает список таблиц, который содержит столбец «coduser»:

 users
messages
passwords
photos
  

Это список элементов 20 .

Мне нужно выполнить поиск по этим таблицам во всех вхождениях, где «coduser» равно «5OEWP1BPSV».

 SELECT * FROM tablenamehere WHERE coduser = "5OEWP1BPSV";
  

но я не использую для этого ничего, кроме MySQL.

В основном просто выполните поиск по всем таблицам, где есть столбец с именем «coduser» и coduser = «5OEWP1BPSV».

Комментарии:

1. Вы имеете в виду, что «valueofcollumnhere» должно быть динамическим?

2. @P.Salmon нет, это статично.

3. Тогда нет вопросов.. ваш запрос будет работать нормально.

4. ну, он не возвращает все значения «статического значения здесь» в этих таблицах :/

5. Докажите это .. дайте мне несколько примеров имен таблиц и фактический код запроса, который вы использовали.

Ответ №1:

Вам нужно будет использовать динамический sql, и, учитывая небольшие задействованные числа, курсор будет уместен

 drop table if exists t,t1;
create table t(id int auto_increment primary key , codeuser varchar(20));
create table t1(id int auto_increment primary key , codeuser varchar(20));

insert into t(codeuser) values
('aaa'),('5OEWP1BPSV');
insert into t(codeuser) values
('bbb');

drop procedure if exists p;
delimiter $$
create procedure p()
begin
declare tablename varchar(20);
declare finished int;
DECLARE GRD_CUR CURSOR FOR 
            SELECT TABLE_NAME
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE COLUMN_NAME like 'codeuser';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FINISHED = 0;
OPEN GRD_CUR;
LOOPROWS:LOOP

FETCH GRD_CUR INTO tablename;

IF FINISHED = 0 THEN
    LEAVE LOOPROWS;
END IF;
#build and execute dynamic sql
set @sql = concat('SELECT  * FROM ' , tablename, ' WHERE codeuser = "5OEWP1BPSV"');
#select @sql;
prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;
END LOOP;
close grd_cur;  
end $$
delimiter ;

call p();
  

Ответ №2:

Перебирайте возвращенный список таблиц и для каждой таблицы в этом списке выполните

 SELECT *
WHERE columnnamehere = "valueofcolumnhere";
  

Имейте в виду, что это даст вам отдельные списки для каждой таблицы в этом цикле FOR, поэтому вам придется каким-то образом объединить их, чтобы получить полный список.

Комментарии:

1. о, как мне выполнить цикл?

2. @Wiliam Brochensque junior — перестаньте извиняться, все начинают с невежества.

3. Зависит от того, какой язык вы используете, но вам понадобится цикл FOR. Найдите в Интернете учебное пособие по циклам FOR для языка, который вы используете.

4. @ollieyeahlong — это конкретный вопрос mysql, и ответом должен быть mysql.

5. я просто использую mysl. Или это невозможно только с mysql?