반응형
여러 데이터베이스를 한 번에 조회
각각의 WordPress 인스턴스가 자체 데이터베이스에 있습니다.업데이트를 위해 'wp_options' 테이블에 저장되고 다음을 통해 액세스할 수 있는 모든 활성 플러그인을 쿼리해야 합니다.
WHERE option_name='active_plugins'
모든 활성 플러그인 설정(여러 데이터베이스에 퍼짐)에 액세스하여 단일 SQL 결과로 출력하려면 어떻게 해야 합니까?알아요.database.tablename
구문, 하지만 위의 내용을 어떻게 처리해야 할까요?Where
진술?
단일 데이터베이스의 요청은 다음과 같습니다.
SELECT option_value
FROM `database`.`wp_options`
WHERE option_name="active_plugins"
SELECT option_value
FROM `database1`.`wp_options`
WHERE option_name="active_plugins"
UNION
SELECT option_value
FROM `database2`.`wp_options`
WHERE option_name="active_plugins"
펜티엄10의 솔루션은 좋지만, 모든 스키마가 포함될 때마다 쿼리를 확장해야 하는 단점이 있습니다.아래 솔루션은 준비된 문장을 사용하여 다음을 가진 MySQL 서버의 모든 스키마에 대한 결과 집합을 생성합니다.wp_options
테이블. 이게 더 편하실 겁니다.
DROP PROCEDURE IF EXISTS `MultipleSchemaQuery`;
DELIMITER $$
CREATE PROCEDURE `MultipleSchemaQuery`()
BEGIN
declare scName varchar(250);
declare q varchar(2000);
DROP TABLE IF EXISTS ResultSet;
create temporary table ResultSet (
option_value varchar(200)
);
DROP TABLE IF EXISTS MySchemaNames;
create temporary table MySchemaNames (
schemaName varchar(250)
);
insert into MySchemaNames
SELECT distinct
TABLE_SCHEMA as SchemaName
FROM
`information_schema`.`TABLES`
where
TABLE_NAME = 'wp_options';
label1:
LOOP
set scName = (select schemaName from MySchemaNames limit 1);
set @q = concat('select option_value from ', scName, '.wp_options where option_name=\'active_plugins\'');
PREPARE stmt1 FROM @q;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
delete from MySchemaNames where schemaName = scName;
IF ((select count(*) from MySchemaNames) > 0) THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SELECT * FROM ResultSet;
DROP TABLE IF EXISTS MySchemaNames;
DROP TABLE IF EXISTS ResultSet;
END
$$
DELIMITER ;
CALL MultipleSchemaQuery();
그루버의 답변은 훌륭하지만 구문 오류가 있습니다. 10행 끝에 가짜 쉼표가 있습니다.구문 오류가 수정된 코드는 다음과 같습니다.
DELIMITER $$
CREATE PROCEDURE `MultipleSchemaQuery`()
BEGIN
declare scName varchar(250);
declare q varchar(2000);
DROP TABLE IF EXISTS ResultSet;
create temporary table ResultSet (
option_value varchar(200)
);
DROP TABLE IF EXISTS MySchemaNames;
create temporary table MySchemaNames (
schemaName varchar(250)
);
insert into MySchemaNames
SELECT distinct
TABLE_SCHEMA as SchemaName
FROM
`information_schema`.`TABLES`
where
TABLE_NAME = 'wp_options';
label1:
LOOP
set scName = (select schemaName from MySchemaNames limit 1);
set @q = concat('select option_value from ', scName, '.wp_options where option_name=\'active_plugins\'');
PREPARE stmt1 FROM @q;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
delete from MySchemaNames where schemaName = scName;
IF ((select count(*) from MySchemaNames) > 0) THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SELECT * FROM ResultSet;
DROP TABLE IF EXISTS MySchemaNames;
DROP TABLE IF EXISTS ResultSet;
END
$$
프로시저, 커서, 전체 조합 및 준비된 문을 사용하여 여러 데이터베이스를 쿼리하는 또 다른 예입니다.삭제 및 삭제 권한이 필요하지 않음
USE `my_db`;
DROP PROCEDURE IF EXISTS `CountAll`;
DELIMITER $$
CREATE PROCEDURE `CountAll`(IN tableName VARCHAR(255))
BEGIN
DECLARE db_name VARCHAR(250);
DECLARE exit_loop BOOLEAN;
DECLARE union_query TEXT DEFAULT '';
DECLARE my_databases CURSOR FOR
SELECT DISTINCT `table_schema`
FROM `information_schema`.`tables`
WHERE
`table_schema` LIKE 'myprefix\_%' AND
`table_name` = tableName;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET exit_loop = TRUE;
OPEN my_databases;
get_database: LOOP
FETCH my_databases INTO db_name;
IF exit_loop THEN
-- remove trailing UNION ALL statement
SET union_query = TRIM(TRAILING ' UNION ALL ' FROM union_query);
LEAVE get_database;
END IF;
SET union_query = concat(union_query, 'SELECT COUNT(*) AS qty FROM ',
db_name, '.', tableName, ' UNION ALL ');
END LOOP get_database;
CLOSE my_databases;
SET @final_query = concat('SELECT SUM(qty) FROM (', union_query,
') AS total;');
PREPARE stmt1 FROM @final_query;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;
CALL CountAll('wp_options');
언급URL : https://stackoverflow.com/questions/2132654/querying-multiple-databases-at-once
반응형
'programing' 카테고리의 다른 글
결과 그룹화 없이 SUM() 사용 (0) | 2023.09.25 |
---|---|
Android 인터넷 연결 확인 (0) | 2023.09.25 |
Pandas DataFrame 적용() 모든 코어 사용? (0) | 2023.09.25 |
CSS/HTML만 사용하여 이미지 깨짐 아이콘을 숨기는 방법? (0) | 2023.09.25 |
새 데이터베이스 서버로 마이그레이션됨. 동일한 쿼리가 매우 느림 (0) | 2023.09.25 |