Trong bài đăng trên blog này, chúng ta sẽ tìm hiểu cách nhóm các bộ giá trị thành một danh sách được phân tách bằng dấu phẩy, cho mỗi nhóm, bằng cách sử dụng hàm GROUP_CONCAT[] của MySQL. Tiếp tục đọc để biết thêm thông tin…
Khám phá các bài báo cao cấp, hướng dẫn chuyên sâu, video hướng dẫn, v.v. bằng cách tham gia tư cách thành viên “MySQL Learning Tier”. Bạn có quyền truy cập vào nội dung độc quyền chưa được xuất bản ở bất kỳ nơi nào khác với tư cách thành viên này. Với nội dung mới được bổ sung thường xuyên, hãy tiếp tục học MySQL ở mọi cấp độ
Học MySQL
Nếu bạn thích nội dung được viết ở đây, bằng mọi cách, hãy chia sẻ blog này và [các] bài đăng yêu thích của bạn với những người khác, những người cũng có thể được hưởng lợi hoặc thích nội dung đó. Vì cà phê là thức uống yêu thích của tôi nên bạn thậm chí có thể mua cho tôi một ly nếu muốn.
Nhận các bài báo phù hợp với Refind được gửi mỗi ngày trong hộp thư đến của bạn. Refind là một phần trong thói quen đọc hàng ngày của tôi. Biến nó thành một phần của bạn bằng cách sử dụng liên kết giới thiệu của tôi. Bạn không phải trả thêm phí, tôi sẽ đủ điều kiện đăng ký trả phí với nhiều lượt đăng ký hơn từ liên kết của tôi. “Bản chất của web, mỗi sáng trong hộp thư đến của bạn. Đăng ký miễn phí“
Bản tin dành cho các nhà phát triển PHP và MySQLNhận bản sao sách điện tử của tôi, “10 mẹo MySQL cho mọi người”, hoàn toàn miễn phí khi bạn đăng ký nhận bản tin của OpenLampTech.
Tôi đang sử dụng bảng 'group_member' hư cấu này cho dữ liệu truy vấn và ví dụ. Có 4 nhóm riêng biệt. 100, 200, 300 và 400 tương ứng
Để đặt từng 'tên_thành_viên' theo thứ tự abc trong nhóm tương ứng của nó, chúng ta có thể sử dụng hàm GROUP_CONCAT[] và GROUP THEO cột 'group_num', chỉ định dấu phẩy làm giá trị SEPARATOR
Bạn có phải là thành viên của Medium không? . Không phải là một thành viên? . Sử dụng liên kết đăng ký của tôi [tôi sẽ nhận được hoa hồng mà bạn không phải trả thêm phí] và tham gia. Tôi thực sự thích đọc tất cả những nội dung tuyệt vời ở đó và tôi biết bạn cũng vậy
Tôi đã bao gồm một đoạn video ngắn về hoạt động của đoạn mã trên để bạn có thể thấy nó hoạt động như thế nào
Thể hiện sự ủng hộ và đánh giá cao của bạn đối với nội dung của tôi bằng cách ném bất kỳ tiền lẻ dự phòng nào của bạn vào Lọ đựng tiền boa của tôi
Lọ đựng tiền boa
Cảm ơn bạn đã đọc bài viết này. Hãy chia sẻ nó với người khác cũng sẽ thích nó
Josh Otwell có niềm đam mê phát triển với tư cách là Nhà phát triển PHP, chuyên gia SQL và blogger/nhà văn kỹ thuật
từ chối trách nhiệm. Phần lớn các ví dụ trong bài đăng này, được thực hiện trong môi trường máy trạm học tập/phát triển cá nhân và không nên được coi là chất lượng sản xuất hoặc sẵn sàng. Mục tiêu và nhu cầu cụ thể của bạn có thể thay đổi. Như mọi khi, chỉ vì bạn có thể làm điều gì đó không có nghĩa là bạn nên làm. Ý kiến của tôi là của riêng tôi
Nhiều cách khác tôi có thể giúp
- Bắt đầu một blog? . Hãy để cả hai tiết kiệm tiền cho các kế hoạch được cung cấp. 💸
- Thu hút sự chú ý đến thương hiệu, sản phẩm hoặc dịch vụ của bạn với vị trí quảng cáo được phân loại giá cả phải chăng trong bản tin OpenLampTech
- Cần lưu trữ cho ứng dụng web hoặc trang web WordPress tiếp theo của bạn? . Dịch vụ này không ai sánh kịp và họ cung cấp SSL miễn phí
- 🔒5 sự thật tôi nhận ra với tư cách là một nhà phát triển tự học
Tiết lộ. Một số dịch vụ và liên kết sản phẩm của bài đăng trên blog này là các liên kết liên kết. Bạn không phải trả thêm phí, nếu bạn mua hàng bằng cách nhấp qua một trong số chúng, tôi sẽ nhận được hoa hồng
Đáng ngạc nhiên là MySQL không có chức năng dành riêng cho hoạt động này trái ngược với split_part trong PostgreSQL. May mắn thay, nó có hàm SUBSTRING_INDEX[] thực hiện hầu hết những gì chúng ta cần
Từ tài liệu chính thức
0CREATE TABLE employees [ id SERIAL, name VARCHAR[255], address TEXT, PRIMARY KEY [id] ]; INSERT INTO employees [id, name, address] VALUES [1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'], [2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
Trả về chuỗi con từ chuỗi str trước khi đếm số lần xuất hiện của dấu phân cách. Nếu số đếm là dương, mọi thứ ở bên trái của dấu phân cách cuối cùng [đếm từ bên trái] được trả về. Nếu số đếm là âm, mọi thứ ở bên phải của dấu phân cách cuối cùng [đếm từ bên phải] được trả về.
1 thực hiện khớp phân biệt chữ hoa chữ thường khi tìm kiếm dấu phân cáchCREATE TABLE employees [ id SERIAL, name VARCHAR[255], address TEXT, PRIMARY KEY [id] ]; INSERT INTO employees [id, name, address] VALUES [1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'], [2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
mysql> SELECT SUBSTRING_INDEX['www.mysql.com', '.', 2]; -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX['www.mysql.com', '.', -2]; -> 'mysql.com'Chức năng này an toàn cho nhiều byte
Các định nghĩa
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
Dung dịch
Giả sử chúng tôi muốn tìm tất cả nhân viên làm việc ở một tiểu bang nhất định [ví dụ:
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
2], đây là trường thứ tư trong cột chứa địa chỉ dưới dạng các giá trị được phân tách bằng dấu phẩyVới chức năng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
3, chúng tôi sẽ có thể trích xuất mọi thứ cho đến cột thứ tư chứa trạng tháiSELECT SUBSTRING_INDEX[address, ',', 4] FROM employees;
+-----------+------------------------------------+
| name | SUBSTRING_INDEX[address, ',', 4] |
+-----------+------------------------------------+
| John Doe | 4225 Collins Street,Apt. A,Erie,PA |
| Bob Smith | 234 Main Street,,Erie,PA |
+-----------+------------------------------------+
Bây giờ chúng ta biết rằng trạng thái sẽ luôn là trường cuối cùng trong giá trị kết quả. Vì hàm
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 cho phép sử dụng các giá trị âm để trích xuất các trường đếm từ bên phải nên chúng tôi sẽ sử dụng khả năng này để trích xuất trường ngoài cùng bên phải có chứa chữ viết tắt của tiểu bang________số 8Giải pháp cuối cùng để tất cả nhân viên làm việc ở một trạng thái nhất định được hiển thị bên dưới
SELECT name FROM employees WHERE SUBSTRING_INDEX[SUBSTRING_INDEX[address, ',', 4], ',', -1]='PA';
+-----------+
| name |
+-----------+
| John Doe |
| Bob Smith |
+-----------+
Hãy cẩn thận
Một điều cần lưu ý về
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 là hàm trả về toàn bộ chuỗi nếu trường được yêu cầu không tồn tạiVí dụ:
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
6 trả về địa chỉ đầy đủCREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
2Sau đó, cố gắng trích xuất trường thứ sáu bằng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
7 sẽ cung cấp cho chúng tôi mã zip [trường thứ năm] saiCREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
4Một cách giải quyết khả thi cho vấn đề này là kiểm tra xem số lượng trường có lớn hơn hoặc bằng chỉ mục được yêu cầu hay không và sau đó nhập mã ở trên hoặc trả về chuỗi trống nếu chỉ mục trường không hợp lệ
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
5sử dụng có thể
Trong hầu hết các trường hợp, tốt hơn là sử dụng một bảng tra cứu riêng biệt hoặc một cột cho từng trường thay vì lưu trữ dữ liệu dưới dạng các giá trị được phân tách bằng dấu phẩy để tra cứu sau này
Tuy nhiên, có thể có những trường hợp hiếm hoi mà thủ thuật trên có thể hữu ích. Ví dụ: gần đây tôi cần trả về một danh sách các giá trị từ hàm do người dùng xác định và cách duy nhất để làm điều đó là trả về một chuỗi chứa các giá trị được phân tách bằng dấu phẩy. Cuối cùng tôi đã sử dụng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 để sắp xếp kết quả theo một trong các trườngTìm kiếm trong cột chứa các giá trị được phân tách bằng dấu phẩy
MySQL có một hàm chuyên dụng FIND_IN_SET[] trả về chỉ mục trường nếu giá trị được tìm thấy trong một chuỗi chứa các giá trị được phân tách bằng dấu phẩy
Ví dụ: câu lệnh sau trả về chỉ mục dựa trên một giá trị
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
9 trong chuỗi SELECT SUBSTRING_INDEX[address, ',', 4] FROM employees;
+-----------+------------------------------------+
| name | SUBSTRING_INDEX[address, ',', 4] |
+-----------+------------------------------------+
| John Doe | 4225 Collins Street,Apt. A,Erie,PA |
| Bob Smith | 234 Main Street,,Erie,PA |
+-----------+------------------------------------+
0