2013-03-19 14 views
5

Chcę wybrać nazwy kolumn, ale nie wiem struktury tabeli z wyprzedzeniem i może się zmienić, więc nie mogę po prostu sztywno zakodować instrukcji select z nazwami kolumn. Ja też NIE chcę wybierać każdej kolumny. Czy istnieje i łatwy sposób to zrobić?Jak dynamicznie wybierać nazwy kolumn w mySQL

Moje myśli są połączeniem tych dwóch pytań, ale mój SQL nie jest tak dobry.

SHOW COLUMNS FROM table_name; 
SELECT * FROM table_name; 

Próbowałem użyć wybierania podrzędnego, ale nie zadziałało. Nic się nie dzieje, nie pojawia się błąd, po prostu nie daje rezultatów

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

Może muszę zrobić przyłączyć? .. każdym razie jakiejkolwiek pomocy byłoby świetnie, dzięki

+4

Wydaje się dziwne, że struktura stołu stale się zmienia, co brzmi jak wada projektowa. Czy możesz opublikować swoją aktualną strukturę lub podać więcej kontekstu dla swoich stołów? – Taryn

+0

To się nie zmienia. Jednak ostateczna struktura tabel nie jest jeszcze gotowa, dlatego staram się stworzyć system, który będzie wystarczająco inteligentny, aby dostosować się do zmian, jakie mogą nastąpić w przyszłości. Nie znam nazw kolumn przed czasem. Mógłbym to zrobić w PHP z 2 oddzielnymi zapytaniami, ale mimo to mogłem to zrobić również w warstwie bazy danych. Myślałem, że mogę uzyskać nazwy kolumn, a następnie użyć tych danych do zapytania tabeli w zasadzie zbudować dynamiczną instrukcję wyboru. – TheSnooker

+0

Możesz to zrobić za pomocą dynamicznego SQL (będą to skutecznie dwa zapytania), ale jeśli nie chcesz wszystkich kolumn, będziesz musiał kodować w zapytaniu wybierając kolumny z metadanych, jakie są kryteria, w tym kolumna (i dowolne zamówienie, które chcesz). Nie można jednak zamienić wyników zapytania na metadane bezpośrednio na listę wyboru dla zapytania wyboru. –

Odpowiedz

2

Spróbuj 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; 

Niektóre kwestie:

najprawdopodobniej chcą jakąś ORDER BY na zestaw wyników.

Istnieje ograniczenie co do możliwości łączenia i rzeczy.

Przenoszenie sprawdzania poprawności do środowiska wykonawczego, w przypadku którego prawdopodobieństwo pominięcia podczas testowania jest większe.

Masz nadzieję, że będziesz w stanie łatwo obsługiwać zmiany schematu. Ta technika będzie obsługiwać tylko zmiany schematu pewnego typu, które można przewidzieć, a inne prawdopodobnie i tak będą musiały zmienić ten kod.

+0

Tak, widzę co masz na myśli. Miałem nadzieję, że uda mi się stworzyć inteligentny system zapytań, który przechwyci tylko niektóre kolumny w oparciu o zestaw reguł, które mogę zdefiniować i zmienić. Im więcej patrzę na to podejście, tym bardziej zdaję sobie sprawę, że prawdopodobnie spowodowałoby to większą złożoność niż wtedy, gdy jest ono warte. Nigdy nie myślałem o użyciu CONCAT, sprytnie. – TheSnooker

+0

Generowanie kodu JavaScript i dynamiczny SQL mają miejsce w ułatwianiu utrzymywania systemów. W rzeczywistości mam całą prezentację na temat używania metadanych do generowania kodu i monitorowania stanu kodu bazy danych. Ale nie sądzę, że ma on w przyszłości specjalne, lepsze miejsce do sprawdzania tego konkretnego scenariusza. –