Câu trả lời:
Để có được tất cả các bảng có cột columnA
hoặc ColumnB
trong cơ sở dữ liệu YourDatabase
:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
DATABASE()
thay vì một chuỗi để tìm kiếm trong cơ sở dữ liệu hiện được chọn.
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
TABLE_SCHEMA
vào các trường của bộ trả về để xem tất cả các cơ sở dữ liệu + bảng có chứa tên cột đó.
show tables;
. Bất cứ ai có thể giải thích tại sao điều này có thể là trường hợp?
Đơn giản hơn được thực hiện trong một dòng SQL:
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Trong phiên bản không có information_schema
(phiên bản cũ hơn hoặc một số ndb), bạn có thể kết xuất cấu trúc bảng và tìm kiếm cột theo cách thủ công.
mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql
Bây giờ hãy tìm kiếm tên cột some_file.sql
bằng cách sử dụng trình soạn thảo văn bản ưa thích của bạn hoặc sử dụng một số tập lệnh awk tiện lợi.
Và một tập lệnh sed đơn giản để tìm cột, chỉ cần thay thế COLUMN_NAME bằng của bạn:
sed -n '/^USE/{h};/^CREATE/{H;x;s/\nCREATE.*\n/\n/;x};/COLUMN_NAME/{x;p};' <some_file.sql
USE `DATABASE_NAME`;
CREATE TABLE `TABLE_NAME` (
`COLUMN_NAME` varchar(10) NOT NULL,
Bạn có thể đổ ống trực tiếp vào sed nhưng điều đó không quan trọng.
Đối với những người tìm kiếm nghịch đảo của điều này, tức là tìm kiếm các bảng không chứa một tên cột nhất định, đây là truy vấn ...
SELECT DISTINCT TABLE_NAME FROM information_schema.columns WHERE
TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME NOT IN (SELECT DISTINCT
TABLE_NAME FROM information_schema.columns WHERE column_name =
'column_name' AND TABLE_SCHEMA = 'your_db_name');
Điều này thực sự hữu ích khi chúng tôi bắt đầu triển khai từ từ việc sử dụng ai_col
cột đặc biệt của InnoDB và cần phải tìm ra trong số 200 bảng của chúng tôi chưa được nâng cấp.
Nếu bạn muốn " Để chỉ lấy tất cả các bảng ", thì hãy sử dụng truy vấn này:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%'
and TABLE_SCHEMA = 'tresbu_lk'
Nếu bạn muốn " Để lấy tất cả các bảng có Cột ", thì hãy sử dụng truy vấn này:
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%'
AND TABLE_SCHEMA='tresbu_lk'
Sử dụng truy vấn một dòng này, thay thế mong muốn_column_name bằng tên cột của bạn.
SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
Vấn đề với information_schema là nó có thể rất chậm. Nó nhanh hơn để sử dụng các lệnh SHOW.
Sau khi bạn chọn cơ sở dữ liệu, trước tiên bạn gửi truy vấn HIỂN THỊ BẢNG. Và sau đó bạn thực hiện SHOW COLUMNS cho mỗi bảng.
Trong PHP sẽ trông giống như
$ res = mysqli_query ("HIỂN THỊ BẢNG"); trong khi ($ row = mysqli_fetch_array ($ res)) {$ rs2 = mysqli_query ("HIỂN THỊ MÀU SẮC TỪ". $ row [0]); trong khi ($ rw2 = mysqli_fetch_array ($ rs2)) {if ($ rw2 [0] == $ mục tiêu) .... } }
select distinct table_name
from information_schema.columns
where column_name in ('ColumnA')
and table_schema='YourDatabase';
and table_name in
(
select distinct table_name
from information_schema.columns
where column_name in ('ColumnB')
and table_schema='YourDatabase';
);
Điều đó ^^ sẽ nhận được các bảng với CộtA VÀ CộtB thay vì CộtA HOẶC CộtB như câu trả lời được chấp nhận