2013-03-19 10 views
5

Ich möchte Spaltennamen auswählen, aber ich weiß nicht die Tabellenstruktur im Voraus und es kann sich ändern, so kann ich nicht nur die Select-Anweisung mit Spaltennamen hart Code. Ich möchte auch nicht jede Spalte auswählen. Gibt es einen einfachen Weg dies zu tun?Wie wählt man Spaltennamen dynamisch in mySQL

Meine Gedanken sind, es ist eine Art Kombination dieser beiden Abfragen, aber mein SQL ist nicht so gut.

SHOW COLUMNS FROM table_name; 
SELECT * FROM table_name; 

Ich versuchte mit einem Sub-Select, aber es hat nicht funktioniert. Nichts scheint zu passieren, ich habe nicht einen Fehler bekomme ich nur keine Ergebnisse

SELECT (SELECT column_name 
     FROM information_schema.columns 
     WHERE table_name ='table_name') 
FROM table_name; 

Vielleicht brauche ich eine Verknüpfung zu tun? .. Auf jeden Fall jede Hilfe wäre toll, dank

+4

Es scheint seltsam, dass sich die Tabellenstruktur ständig ändert, das klingt wie ein Designfehler. Können Sie Ihre aktuelle Struktur posten oder mehr Kontext für Ihre Tabellen bereitstellen? – Taryn

+0

Es ändert sich nicht ständig. Die endgültige Struktur der Tabellen ist jedoch noch nicht in Stein gemeißelt, und deshalb versuche ich, ein System zu schaffen, das schlau genug ist, sich an die zukünftigen Änderungen anzupassen. Ich kenne die Spaltennamen nicht im Voraus. Ich könnte dies in PHP mit 2 separaten Abfragen tun, aber ich könnte es auch auf der Ebene der Datenbank tun. Ich dachte, ich könnte die Spaltennamen bekommen, dann verwenden Sie diese Daten, um die Tabelle im Grunde eine dynamische Select-Anweisung zu erstellen. – TheSnooker

+0

Sie können dies mit dynamischem SQL tun (es werden effektiv zwei Abfragen sein), aber wenn Sie nicht alle Spalten wollen, müssen Sie in Ihre Abfrage einlesen und die Spalten aus den Metadaten auswählen, welche Kriterien für das Einfügen einer Spalte gelten (und jede bestimmte Reihenfolge, die Sie wollen). Sie können die Ergebnisse einer Abfrage für die Metadaten jedoch nicht direkt in eine Auswahlliste für die Auswahlabfrage umwandeln. –

Antwort

2

Versuchen Sie, diese SQLFiddle :

CREATE TABLE atable (
    prefix1 VARCHAR(10) 
    ,prefix2 VARCHAR(10) 
    ,notprefix3 INT 
    ,notprefix4 INT 
); 

INSERT INTO atable VALUES ('qwer qwer', 'qwerqwer', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'asdfaasd', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'qrt vbb', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'sdfg sdg', 1, 1); 

SELECT CONCAT('SELECT ', GROUP_CONCAT(c.COLUMN_NAME), ' FROM atable;') 
INTO @query 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME = 'atable' 
    AND c.COLUMN_NAME LIKE 'prefix%' 
ORDER BY c.ORDINAL_POSITION; 

PREPARE stmt FROM @query; 

EXECUTE stmt; 

Einige Fragen:

Sie werden wahrscheinlich BY auf der Ergebnismenge eine Art bestellen möchten.

Es gibt eine Grenze, was Sie in Bezug auf Joins und Dinge tun können.

Sie verschieben die Validierung zur Laufzeit, wo sie beim Testen wahrscheinlich übersehen wird.

Sie hoffen, Schemaänderungen problemlos verarbeiten zu können. Diese Technik behandelt nur Schemaänderungen eines bestimmten Typs, die Sie vorhersehen können, und andere werden Sie wahrscheinlich diesen Code sowieso ändern müssen.

+0

Ja, ich sehe was du meinst. Ich hatte die Hoffnung, dass ich eine Art intelligentes Abfragesystem erstellen könnte, das nur bestimmte Spalten auf der Basis von Regeln, die ich definieren und ändern könnte, erfassen würde. Je mehr ich mir diesen Ansatz ansehe, desto mehr erkenne ich, dass es wahrscheinlich mehr Komplexität erzeugen würde, als es sich lohnt. Ich habe nie darüber nachgedacht, CONCAT zu benutzen, clever. – TheSnooker

+0

@TheSnooker Code-Generierung und dynamisches SQL hat einen Platz, um die Wartung von Systemen zu erleichtern. In der Tat habe ich eine ganze Präsentation über die Verwendung von Metadaten für die Codegenerierung und die Zustandsüberwachung von Datenbankcodes. Aber ich denke nicht, dass es einen besonderen besseren Platz hat, dieses Szenario in Zukunft zu beweisen. –

Verwandte Themen