MySQL tìm kiếm nhiều cột cho chuỗi

Nó cũng có thể đạt được điều tương tự bằng cách sử dụng lập trình. Bạn cần chọn giá trị trường cột riêng biệt từ Bảng MySQL và lưu trữ giá trị của chúng trong biến đơn sau khi nối giá trị của chúng

Trường hợp 1. Tôi giả sử, Chúng tôi có cột tên, họ trong Bảng DataBase của chúng tôi. Nối các giá trị cột tên, họ trong một dạng chuỗi đơn

Có hai chức năng để làm điều này -

  • CONCAT
  • CONCAT_WS

Chức năng trên hoạt động cho nối nhiều cột

CONCAT

Hàm này được sử dụng để nối nhiều cột hoặc chuỗi thành một cột duy nhất. Các đối số của phương thức được phân tách bằng dấu phẩy

Cú pháp –

Liên kết được tài trợ
CONCAT( column1, column2, … )
OR
CONCAT ( string1, string2, … )

Truy vấn MySQL để nối các cột của bảng

SELECT 
   CONCAT( firstname, " ", lastname ) AS fullname, salary
   FROM employees

CONCAT_WS

Hàm CONCAT_WS() được sử dụng để thêm nhiều giá trị chuỗi và biến chúng thành một giá trị chuỗi đơn. Sự khác biệt chính giữa CONCAT()CONCAT_WS() là chúng ta có thể định nghĩa dấu phân cách. Nó cũng cho phép bạn xác định dấu phân cách ( ” “, “, “, ” – “, v.v. )

Trong bài viết này, chúng tôi xin hướng dẫn các bạn cách tìm các hàng có giá trị NULL trong nhiều cột trong MySQL

giải pháp nhanh chóng

SELECT *
FROM `table_name` 
WHERE `column1` IS NULL AND `column2` IS NULL AND `columnN` IS NULL;
SELECT *
FROM `users`
WHERE COALESCE(`column1`, `column2`) IS NULL;

Ví dụ thực tế

Để hiển thị cách tìm các hàng có giá trị NULL trong nhiều cột, chúng tôi sẽ sử dụng bảng sau

MySQL tìm kiếm nhiều cột cho chuỗi
MySQL - chọn các hàng có giá trị NULL trong nhiều cột - dữ liệu ví dụ

Ghi chú

Ở cuối bài viết này, bạn có thể tìm thấy các truy vấn SQL chuẩn bị cơ sở dữ liệu

ví dụ 1

Trong ví dụ này, chúng ta sẽ chọn tất cả các hàng có giá trị NULL ở cả cột email và cột

SELECT *
FROM `users`
WHERE COALESCE(`column1`, `column2`) IS NULL;
0 bằng cách sử dụng hàm
SELECT *
FROM `users`
WHERE COALESCE(`column1`, `column2`) IS NULL;
6

Bạn có thể sử dụng các đối sánh mẫu để xem qua bất kỳ số lượng hàng nào, nhưng khi số lượng văn bản tăng lên, thao tác đối sánh có thể trở nên khá chậm. Việc tìm kiếm cùng một văn bản trong một số cột chuỗi cũng phổ biến, việc khớp mẫu có xu hướng dẫn đến các truy vấn khó sử dụng

SELECT * from tbl_name
WHERE col1 LIKE 'pat' OR col2 LIKE 'pat' OR col3 LIKE 'pat' ...

Một giải pháp thay thế hữu ích (có sẵn kể từ MySQL 3. 23. 23) là sử dụng tính năng tìm kiếm

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3, được thiết kế để xem qua một lượng lớn văn bản và có thể tìm kiếm đồng thời nhiều cột. Để sử dụng khả năng này, hãy thêm chỉ mục
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 vào bảng của bạn, sau đó sử dụng toán tử
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
5 để tìm kiếm các chuỗi trong cột hoặc các cột được lập chỉ mục. Lập chỉ mục
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 có thể được sử dụng với các bảng MyISAM, cho các cột loại
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
7,
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
8 hoặc
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
9

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 tìm kiếm được minh họa tốt nhất với phần nội dung văn bản có kích thước hợp lý. Nếu bạn không có bộ dữ liệu mẫu, một số kho lưu trữ văn bản điện tử có sẵn miễn phí có sẵn trên Internet. Đối với các ví dụ ở đây, bản tôi đã chọn là bản văn đầy đủ của Bản Kinh thánh King James (KJV), bản này tương đối lớn và có ưu điểm là được cấu trúc độc đáo theo sách, chương và câu. Do kích thước của nó, bộ dữ liệu này không được bao gồm trong bản phân phối
CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
1, nhưng có sẵn dưới dạng bản phân phối
CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
2 tại trang web MySQL Cookbook. [] (Xem Phụ lục A. ) Bản phân phối bao gồm một tệp
CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
3 chứa các bản ghi câu thơ. Một số hồ sơ mẫu trông như thế này

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.

Mỗi bản ghi chứa các trường sau

  • phần sách. Đây là

    CREATE TABLE kjv
    (
        bsect   ENUM('O','N') NOT NULL,         # book section (testament)
        bname   VARCHAR(20) NOT NULL,           # book name
        bnum    TINYINT UNSIGNED NOT NULL,      # book number
        cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
        vnum    TINYINT UNSIGNED NOT NULL,      # verse number
        vtext   TEXT NOT NULL                   # text of verse
    ) TYPE = MyISAM;
    4 hoặc
    CREATE TABLE kjv
    (
        bsect   ENUM('O','N') NOT NULL,         # book section (testament)
        bname   VARCHAR(20) NOT NULL,           # book name
        bnum    TINYINT UNSIGNED NOT NULL,      # book number
        cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
        vnum    TINYINT UNSIGNED NOT NULL,      # verse number
        vtext   TEXT NOT NULL                   # text of verse
    ) TYPE = MyISAM;
    5, biểu thị Cựu Ước hoặc Tân Ước

  • Tên sách và số sách tương ứng, từ 1 đến 66

  • Số chương và số câu

  • Nguyên văn câu thơ

Để nhập các bản ghi vào MySQL, hãy tạo một bảng có tên

CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
6 giống như thế này

CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;

Sau đó tải tệp

CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
3 vào bảng bằng cách sử dụng câu lệnh này

mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;

Bạn sẽ nhận thấy rằng bảng

CREATE TABLE kjv
(
    bsect   ENUM('O','N') NOT NULL,         # book section (testament)
    bname   VARCHAR(20) NOT NULL,           # book name
    bnum    TINYINT UNSIGNED NOT NULL,      # book number
    cnum    TINYINT UNSIGNED NOT NULL,      # chapter number
    vnum    TINYINT UNSIGNED NOT NULL,      # verse number
    vtext   TEXT NOT NULL                   # text of verse
) TYPE = MyISAM;
6 chứa các cột cho cả hai tên sách (Sáng thế ký, Xuất hành,. ) và số sách (1, 2,. ). Tên và số có sự tương ứng cố định và cái này có thể được bắt nguồn từ cái kia—một sự dư thừa có nghĩa là bảng không ở dạng bình thường. Có thể loại bỏ sự dư thừa bằng cách chỉ lưu trữ số sách (chiếm ít dung lượng hơn tên), sau đó tạo tên khi cần trong kết quả truy vấn bằng cách nối các số vào một bảng ánh xạ nhỏ liên kết từng số sách với tên tương ứng. Nhưng tôi muốn tránh sử dụng phép nối vào thời điểm này. Do đó, bảng bao gồm tên sách để kết quả tìm kiếm có thể được giải thích dễ dàng hơn và số để kết quả có thể được sắp xếp dễ dàng theo thứ tự sách

Sau khi điền vào bảng, hãy chuẩn bị nó để sử dụng trong tìm kiếm

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 bằng cách thêm chỉ mục
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3. Điều này có thể được thực hiện bằng cách sử dụng câu lệnh
mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
1
mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
2. []

mysql> ALTER TABLE kjv ADD FULLTEXT (vtext);

Để thực hiện tìm kiếm bằng cách sử dụng chỉ mục, hãy sử dụng

mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
3 để đặt tên cho cột được lập chỉ mục và
mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
4 để chỉ định văn bản cần tìm. Ví dụ: để trả lời câu hỏi "Cái tên Mizraim có thường xuyên xảy ra không?"

mysql> SELECT COUNT(*) from kjv WHERE MATCH(vtext) AGAINST('Mizraim');
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+

Để biết những câu đó là gì, hãy chọn các cột bạn muốn xem (ví dụ ở đây sử dụng

mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
6 để kết quả phù hợp hơn với trang)

mysql> SELECT bname, cnum, vnum, vtext
    -> FROM kjv WHERE MATCH(vtext) AGAINST('Mizraim')\G
*************************** 1. row ***************************
bname: Genesis
 cnum: 10
 vnum: 6
vtext: And the sons of Ham; Cush, and Mizraim, and Phut, and Canaan.
*************************** 2. row ***************************
bname: Genesis
 cnum: 10
 vnum: 13
vtext: And Mizraim begat Ludim, and Anamim, and Lehabim, and Naphtuhim,
*************************** 3. row ***************************
bname: 1 Chronicles
 cnum: 1
 vnum: 8
vtext: The sons of Ham; Cush, and Mizraim, Put, and Canaan.
*************************** 4. row ***************************
bname: 1 Chronicles
 cnum: 1
 vnum: 11
vtext: And Mizraim begat Ludim, and Anamim, and Lehabim, and Naphtuhim,

Kết quả được đưa ra theo thứ tự sách, chương và số câu trong trường hợp cụ thể này, nhưng đó thực sự chỉ là sự trùng hợp. Theo mặc định,

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 tìm kiếm tính toán xếp hạng mức độ liên quan và sử dụng nó để sắp xếp. Để đảm bảo kết quả tìm kiếm được sắp xếp theo cách bạn muốn, hãy thêm mệnh đề
mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
8
mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
9 rõ ràng

SELECT bname, cnum, vnum, vtext
FROM kjv WHERE MATCH(vtext) AGAINST('search string')
ORDER BY bnum, cnum, vnum;

Bạn có thể bao gồm các tiêu chí bổ sung để thu hẹp tìm kiếm hơn nữa. Các truy vấn sau đây thực hiện các tìm kiếm cụ thể hơn dần dần để tìm hiểu tần suất tên Áp-ra-ham xuất hiện trong toàn bộ KJV, Tân Ước, sách Hê-bơ-rơ và Chương 11 của Hê-bơ-rơ

mysql> SELECT COUNT(*) from kjv WHERE MATCH(vtext) AGAINST('Abraham');
+----------+
| COUNT(*) |
+----------+
|      216 |
+----------+
mysql> SELECT COUNT(*) from kjv
    -> WHERE MATCH(vtext) AGAINST('Abraham')
    -> AND bsect = 'N';
+----------+
| COUNT(*) |
+----------+
|       66 |
+----------+
mysql> SELECT COUNT(*) from kjv
    -> WHERE MATCH(vtext) AGAINST('Abraham')
    -> AND bname = 'Hebrews';
+----------+
| COUNT(*) |
+----------+
|       10 |
+----------+
mysql> SELECT COUNT(*) from kjv
    -> WHERE MATCH(vtext) AGAINST('Abraham')
    -> AND bname = 'Hebrews' AND cnum = 11;
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+

Nếu bạn muốn sử dụng tiêu chí tìm kiếm bao gồm các cột không phải ______7_______3 khác thường xuyên, bạn có thể tăng hiệu suất của các truy vấn đó bằng cách thêm các chỉ mục thông thường vào các cột đó. Ví dụ: để lập chỉ mục cho các cột số cuốn sách, chương và câu, hãy làm điều này

mysql> ALTER TABLE kjv ADD INDEX (bnum), ADD INDEX (cnum), ADD INDEX (vnum);

Các chuỗi tìm kiếm trong truy vấn

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 có thể bao gồm nhiều hơn một từ đơn lẻ và bạn có thể cho rằng việc thêm các từ bổ sung sẽ giúp tìm kiếm cụ thể hơn. Nhưng trên thực tế, điều đó mở rộng nó, bởi vì tìm kiếm
O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 trả về các bản ghi có chứa bất kỳ từ nào. Trên thực tế, truy vấn thực hiện tìm kiếm
mysql> ALTER TABLE kjv ADD FULLTEXT (vtext);
3 bất kỳ từ nào. Điều này được minh họa bằng các truy vấn sau, xác định số lượng câu lớn hơn liên tục khi các từ tìm kiếm bổ sung được thêm vào

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
0

Để thực hiện tìm kiếm trong đó mỗi từ trong chuỗi tìm kiếm phải có mặt, hãy xem Công thức 4. 14

Nếu bạn muốn sử dụng tìm kiếm

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 tìm kiếm đồng thời qua nhiều cột, hãy đặt tên cho tất cả chúng khi bạn xây dựng chỉ mục

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
1

Để đưa ra truy vấn tìm kiếm sử dụng chỉ mục này, hãy đặt tên cho các cột đó trong danh sách

mysql> LOAD DATA LOCAL INFILE 'kjv.txt' INTO TABLE kjv;
3

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
2

O   Genesis 1   1   1   In the beginning God created the heaven and the earth.
O   Exodus  2   20  13  Thou shalt not kill.
N   Luke    42  17  32  Remember Lot's wife.
3 chỉ mục cung cấp một cách nhanh chóng và dễ dàng để thiết lập một công cụ tìm kiếm đơn giản. Một cách để sử dụng khả năng này là cung cấp giao diện dựa trên web cho văn bản được lập chỉ mục. Trang MySQL Cookbook bao gồm một trang tìm kiếm KJV dựa trên web cơ bản thể hiện điều này

Làm cách nào để tìm kiếm nhiều giá trị trong MySQL?

Để chọn nhiều giá trị, bạn có thể sử dụng mệnh đề where với toán tử OR và IN .

Chỉ mục toàn văn bản nhiều cột có thể được sử dụng nếu vậy khi nào?

Các cột trong chỉ mục toàn văn có thể được sắp xếp theo bất kỳ thứ tự nào , nhưng tất cả các cột được chỉ định khi tạo chỉ mục toàn văn phải được tham chiếu trong truy vấn match().

Chúng ta có thể sử dụng nhiều cột trong mệnh đề where không?

Nếu bạn muốn so sánh hai hoặc nhiều cột. bạn phải viết một mệnh đề WHERE phức hợp sử dụng các toán tử logic Truy vấn con nhiều cột cho phép bạn kết hợp các điều kiện WHERE trùng lặp thành một mệnh đề WHERE duy nhất .

Có thể sử dụng Groupby với nhiều cột không?

Cách sử dụng nhóm theo nhiều cột . Tất cả các bản ghi có cùng giá trị cho các cột tương ứng được đề cập trong tiêu chí nhóm có thể được nhóm thành một cột duy nhất bằng cách sử dụng nhóm theo kỹ thuật nhiều cột