2010-03-09 4 views
6

이것은 아마도 간단한 질문 일 뿐이지 만 온라인에서 해결책을 찾을 수 없었기 때문에 도움이 될 것입니다.테이블 와일드 카드를 사용하여 SQL 쿼리를 만들 수 있습니까?

PHP에서 SQL 쿼리를 만들려고하는데 어떻게 든 테이블 필터에 와일드 카드를 적용하고 싶습니다. 아마도 ... select * from %_table_%과 같은 것입니다. 그러나 필자는 테이블 이름이 아닌 열 값에 대한 필터를 지금까지만 볼 수있었습니다.

jan_table_1 
feb_table_1 
jan_table_2 
feb_table_2 

하고, 말하는 "1월"접두어 ... 또는 "1"접미사 만 테이블을 선택하려는 것입니다 : 내가 같은 테이블을 것 예를 들어

.

내가 본 적이없는 빠르고 쉬운 해결책이 있습니까? 미리 감사드립니다!

+0

위치 : 외래 키를 사용? 정규화되지 않았습니다. 매월 테이블을 가져서는 안됩니다. – Leslie

답변

7

없습니다. 그러나 테이블을 월별로 구분해서는 안됩니다. 대신 액세스 속도를 높이려면 적절한 색인을 사용해야합니다.

2

당신이 할 수있는 유일한 방법은 동적으로 특정 테이블에 대한 SQL 문을 생성하고 실행하는 것입니다.

이 작업을 수행하려는 것은 테이블 스키마의 디자인을 다시 방문해야한다는 것을 의미합니다.

1

테이블에서 선택할 때 와일드 카드를 사용할 수 없습니다.

"jan_*" 또는 "*_1" 테이블을 통해보기를 만들고 그 중에서 선택할 수 있습니다.

테이블이 추가 될 때마다 해당보기를 업데이트해야합니다.

7

SQL Server의 당신이 당신의 코드에서이

select * from sys.tables where name like '%table%' 

처럼 원하는 테이블 이름을 조회 할 수 있습니다 당신이 할 수 테이블 이름을 반복하고 그 결과를 각 테이블에 쿼리를 실행하고 병합합니다. 대부분의 다른 RDBMS는 비슷한 기능을합니다.

+2

mysql INFORMATION_SCHEMA.TABLES에서 TABLE_NAME을 선택하십시오. TABLE_NAME은 '% pattern %'와 (과) 비슷합니다. https://dev.mysql.com/doc/refman/5.0/을 참조하십시오. ko/information-schema.html – here

3

이렇게 테이블을 분할해서는 안됩니다. 대신은, 월, 인덱스 컬럼과, 통합 테이블에 모두 넣어 고려 OR 월, 인덱스 열이있는 테이블을 생성하고, 다른 테이블의 행 ID를 참조 :

옵션 1 : 통합 테이블 :

CREATE TABLE Unified (
    month CHAR(3) NOT NULL, 
    ix INT NOT NULL DEFAULT 1, 
    [...], 
    PRIMARY (month, ix, somethingMore), 
    CHECK month IN (
      'jan', 'feb', 'mar', 'apr', 'may', 'jun', 
      'jul', 'aug', 'sep', 'oct', 'nov', 'dec') 
); 

SELECT * FROM Unified where month = 'jan' AND ix = 1; 

// select only tables with a "jan" prefix... or "1" suffix. 
SELECT * FROM Unified where month = 'jan' OR ix = 1 

옵션 2 :이 구조를 수정할 수

CREATE TABLE Partitions (
    id INT AUTO_INCREMENT PRIMARY, 
    month CHAR(3) NOT NULL, 
    ix INT NOT NULL DEFAULT 1, 
    CHECK month IN (
      'jan', 'feb', 'mar', 'apr', 'may', 'jun', 
      'jul', 'aug', 'sep', 'oct', 'nov', 'dec'), 
    INDEX (month, ix) 
) 

CREATE TABLE Stuff (
    partition INT NOT NULL, 
    [...], 
    PRIMARY KEY (partition, somethingMore), 
    FOREIGN KEY fk_Stuff_Partitions (partition) REFERENCES Partitions (id) 
) 

SELECT * FROM Stuff 
    INNER JOIN Partitions ON Stuff.partition = Partitions.id 
WHERE Partition.month = 'jan' AND Partition.ix = 2; 

// select only tables with a "jan" prefix... or "1" suffix. 
SELECT DISTINCT * FROM Stuff 
    INNER JOIN Partitions ON Stuff.partition = Partitions.id 
WHERE Partition.month = 'jan' OR Partition.ix = 1; 
관련 문제