2010-03-09 3 views
6

Dies ist wahrscheinlich eine einfache Frage, aber ich konnte keine Lösung online finden, jede Hilfe wäre sehr willkommen.möglich, SQL-Abfrage mit Tabelle Wildcards zu erstellen?

Ich versuche, eine SQL-Abfrage in PHP zu erstellen und möchte irgendwie eine Wildcard auf den TABLE-Filter anwenden ... etwas vielleicht wie .... select * from %_table_%. Bisher konnte ich jedoch nur Filter für Spaltenwerte und nicht für Tabellennamen sehen.

als Beispiel i Tabellen wie haben würde:

jan_table_1 
feb_table_1 
jan_table_2 
feb_table_2 

und möchte sagen, wählen Sie nur Tabellen mit „Jan“ Präfix ... oder „1“ Suffix.

Gibt es eine schnelle und einfache Lösung, die ich nicht gesehen habe? Danke im Voraus!

+0

Sind Sie in der Lage, diese Struktur zu ändern? Es ist nicht normalisiert, Sie sollten nicht für jeden Monat eine Tabelle haben. – Leslie

Antwort

7

Gibt es nicht. Aber die Tabellen sollten nicht nach Monaten getrennt sein. Stattdessen sollten geeignete Indizes verwendet werden, um den Zugriff zu beschleunigen.

2

Die einzige Möglichkeit besteht darin, die SQL-Anweisung für eine bestimmte Tabelle dynamisch zu generieren und auszuführen.

Die Tatsache, dass Sie dies tun möchten schlägt vor, dass Sie das Design Ihres Tabellenschemas erneut besuchen sollten.

1

Sie können nicht einfach einen Platzhalter verwenden, wenn Sie aus Tabellen auswählen.

Was Sie möglicherweise tun können, ist eine Sicht über Ihre "jan_*" oder "*_1" Tabellen erstellen und daraus auswählen.

Sie müssen diese Ansicht aktualisieren, wenn Tabellen hinzugefügt werden.

7

in SQL Server können Sie die Tabellennamen abfragen für Sie wie diese könnten Sie eine Schleife durch die Tabellennamen

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

In Ihrem Code mögen und Ihre Abfrage auf jede Tabelle ausführen und die Ergebnisse zusammenführen. Die meisten anderen RDBMS haben ähnliche Funktionen.

+2

mysql 'select TABLE_NAME von INFORMATION_SCHEMA.TABLES wo TABLE_NAME wie '% pattern%'' Siehe auch https://dev.mysql.com/doc/refman/5.0/ en/informationsschema.html – here

3

Sie sollten Tabellen nicht so partitionieren. Stattdessen betrachten sie alle in einer einheitlichen Tabelle mit Spalten für Monat und Index oder erstellen Sie eine Tabelle mit Monat und Indexspalten, und verweist auf eine Reihe ID in Ihrem anderen Tisch setzen:

Option 1: einheitliche Tabelle:

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 

Option 2: Verwenden Sie einen Fremdschlüssel:

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; 
Verwandte Themen