2012-07-13 43 views
8

Tôi đang cố gắng chọn nhiều cột, nhưng không phải tất cả các cột, từ cơ sở dữ liệu. Tất cả các cột tôi muốn chọn sẽ bắt đầu bằng "từ".Ký tự đại diện trong tên cột cho MySQL

Vì vậy, trong giả Tôi muốn làm điều này:

SELECT "word%" from searchterms where onstate = 1; 

Nhiều hơn hoặc ít hơn. Tôi không tìm thấy bất kỳ tài liệu hướng dẫn về làm thế nào để làm điều này - là nó có thể trong MySQL? Về cơ bản, tôi đang cố gắng để lưu trữ một danh sách các từ trong một hàng duy nhất, với một định danh, và tôi muốn kết hợp tất cả các từ với định danh đó khi tôi kéo các bản ghi. Tất cả các từ sẽ được tham gia như một chuỗi và chuyển đến một hàm khác trong một mảng/từ điển với mã định danh của chúng.

Tôi đang cố gắng thực hiện các cuộc gọi cơ sở dữ liệu FEW càng tốt để giữ mã nhanh.

Ok, đây là một câu hỏi cho các bạn:

Có sẽ được một số biến của cột với cái tên "chữ" trong đó. Nó sẽ nhanh hơn để thực hiện một cuộc gọi cơ sở dữ liệu riêng biệt cho mỗi hàng, với một truy vấn Python được tạo ra cho mỗi hàng, hoặc nó sẽ nhanh hơn chỉ đơn giản là SELECT *, và chỉ sử dụng các cột mà tôi cần? Có thể nói SELECT * NOT XYZ không?

+0

Sẽ dễ dàng hơn khi sử dụng các hàng thay vì cột? –

+0

Vâng, vấn đề với điều đó, và nó có thể là thiết kế cơ sở dữ liệu của tôi (nó đã được một nhức đầu như vậy trên dự án này), là sau đó tôi cần một hàng cho MACHI từ, và một giá trị liên quan, và tôi không muốn điều đó vì những từ này đều liên quan. Chúng sẽ là một phần của cùng một truy vấn với API. Những người khác, với số nhận dạng khác sẽ là một truy vấn khác. –

+2

Nếu bạn có câu hỏi mới, hãy sử dụng bài đăng mới. Người trả lời không được thông báo về việc bạn chỉnh sửa bài đăng này, hãy nói một mình rằng bạn đã chỉnh sửa nó để đặt một câu hỏi khác. –

Trả lời

8

Không, SQL không cung cấp cho bạn cú pháp nào để thực hiện lựa chọn đó.

Điều bạn có thể làm là yêu cầu MySQL a list of column names trước, sau đó tạo truy vấn SQL từ thông tin đó.

SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'your_table' 
    AND column_name LIKE 'word%' 

hãy chọn tên cột. Sau đó, bạn có thể làm, bằng Python:

"SELECT * FROM your_table WHERE " + ' '.join(['%s = 1' % name for name in columns]) 

Thay vì sử dụng dây nối, tôi sẽ khuyên bạn sử dụng SQLAlchemy thay vì để làm tạo SQL cho bạn.

Tuy nhiên, nếu tất cả những gì bạn đang làm là giới hạn số lượng cột thì không cần thực hiện truy vấn động như thế này. Công việc khó khăn cho cơ sở dữ liệu là chọn các hàng; nó tạo ra sự khác biệt nhỏ khi gửi cho bạn 5 cột trong số 10 hoặc tất cả 10.

Trong trường hợp đó chỉ cần sử dụng "SELECT * FROM ..." và sử dụng Python để chọn ra các cột từ tập hợp kết quả.

+0

Điều này không, trong thực tế, cung cấp cho tôi danh sách chính xác mà tôi phải sử dụng? –

+0

Có, nhưng bạn sẽ phải sử dụng Python để sau đó xây dựng SQL cuối cùng; không có cách SQL thuần túy nào để triển khai truy vấn psuedocode của bạn. –

1

Không, bạn không thể tạo động danh sách các cột được chọn. Nó sẽ phải được mã hóa cứng trong truy vấn cuối cùng của bạn.

Truy vấn hiện tại của bạn sẽ tạo ra tập hợp kết quả với một cột và giá trị của cột đó sẽ là chuỗi "word%" trong tất cả các hàng thỏa mãn điều kiện.

+0

Xem ở trên để biết tên cột: http://stackoverflow.com/a/11466826/1091386 – icedwater

1

Bạn có thể tạo danh sách các tên cột đầu tiên bằng cách sử dụng

SHOW COLUMNS IN tblname LIKE "word%" 

Sau đó lặp qua các con trỏ và tạo ra câu lệnh SQL sử dụng tất cả các cột từ các truy vấn trên.

"SELECT {0} FROM searchterms WHERE onstate = 1".format(', '.join(columns)) 
0

Điều này có thể hữu ích: MySQL wildcard in select

Tóm lại là không thể trong MySQL trực tiếp.

Những gì bạn có thể làm như giải pháp thay thế bẩn là lấy tất cả tên cột từ bảng có truy vấn ban đầu (http://dev.mysql.com/doc/refman/5.0/en/show-columns.html) và sau đó so sánh trong python nếu tên khớp với mẫu của bạn. Sau đó, bạn có thể thực hiện lệnh chọn MySQL với các tên cột được tìm thấy như sau:

SELECT word1, word2, word3 from searchterms where onstate = 1; 
Các vấn đề liên quan