2012-06-11 27 views
5

Tôi hiện có một bảng MySQL như:dữ liệu cột MySQL trở như dấu phẩy phân cách danh sách

id | friend 
1 | 2 
1 | 5 
1 | 10 
3 | 6 
15 | 19 
21 | 4 

Tôi đang cố gắng để lấy tất cả các id người bạn của một người dùng cụ thể và sắp xếp chúng vào một danh sách bằng dấu phẩy phân cách. Ví dụ, nắm lấy bạn bè user1, nó sẽ trở lại như

$friend_list = 2,5,10 

Hiện nay, tôi có:

$sql = "SELECT friend FROM table__friends WHERE id = ".$user_id; 

này chỉ lấy một hàng though..please giúp đỡ!

Cảm ơn

+0

Tôi khá mạnh mẽ chống lại 'GROUP_CONCAT' - cảm giác như lạm dụng cơ chế dữ liệu với tôi. – jnylen

+1

@jnylen - Không chắc chắn lý do tại sao, không có lưu ý cảnh báo của nó bởi các folks MySQL, cũng như, câu hỏi đã được gắn thẻ MySQL, không phải PHP. -Để mỗi người bạn của mình, chỉ cần nói :) – GDP

+0

@GregP Tôi đoán đó là vì các hoạt động cơ sở dữ liệu nên thao tác và trả về các bảng dữ liệu - chúng không nên xử lý các kiểu dữ liệu "giả" như chuỗi được phân tách bằng dấu phẩy. "mã mùi" với tôi. Bất cứ lúc nào bạn có một danh sách phân tách bằng dấu phẩy, có lẽ bạn nên để nó trong hàng hoặc một mảng thay thế. Dưới đây là một ví dụ tốt về các vấn đề bạn có thể gặp phải: http: // stackoverflow.com/questions/6643656/mysql-comma-delimited-list-possible-to-add-và-remove-values? rq = 1 – jnylen

Trả lời

12

Bạn muốn sử dụng GROUP_CONCAT:

$sql = "SELECT GROUP_CONCAT(friend) FROM table__friends GROUP BY id HAVING id = ".$user_id; 

điều chỉnh cho đúng đắn cho mỗi câu trả lời tốt hơn.

+1

được đề cập: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_group_concat_max_len – goat

+1

Và tất nhiên bạn có thể chỉ định dấu phân cách trong GROUP_CONCAT :) –

+0

@WojtekT cung cấp tốt hơn nhiều trả lời ... – GDP

3
$sql = "SELECT GROUP_CONCAT (DISTINCT friend SEPARATOR ',') 
     FROM table_friends GROUP BY id 
     HAVING id =".$user_id; 
0

Có thể bạn đang tìm kiếm chức năng GROUP_CONCAT(column). Ví dụ: herehere.

0

tôi đã sử dụng một biến gọi là @a, để lưu trữ các id, cuối cùng bạn có giá trị trong biến hoặc thử với một giới hạn, trình tự nhóm bằng, như thế này:

mysql> show create table actor\G 
*************************** 1. row *************************** 
     Table: actor 
Create Table: CREATE TABLE `actor` (
    `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(45) NOT NULL, 
    `last_name` varchar(45) NOT NULL, 
    `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`actor_id`), 
    KEY `idx_actor_last_name` (`last_name`) 
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 


mysql> set @a:=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select @a:=concat(@a,",",actor_id) as actor_id from actor where actor_id>195 order by (actor_id) desc limit 1; 
+----------------------------+ 
| actor_id     | 
+----------------------------+ 
| 0,196,197,198,199,200,205, | 
+----------------------------+ 
1 row in set (0.00 sec) 

Trong của bạn trường hợp thay đổi "WHERE điều kiện"

hoặc bạn cũng có thể sau khi chọn:

mysql> select @a; 
+-------------------------------+ 
| @a       | 
+-------------------------------+ 
| 0,196,197,198,199,200,205,206 | 
+-------------------------------+ 
1 row in set (0.00 sec) 
0

truy vấn của bạn sẽ trở lại nhiều hơn một dòng - có vẻ như bạn chỉ đọc Hàng đầu tiên. Bạn muốn một cái gì đó như thế này thay thế:

$sql = "SELECT friend FROM table__friends WHERE id = " 
    . mysql_real_escape_string($user_id); 

$result = mysql_query($sql); 
if (!$result) { 
    die("Something bad happened"); 
} 

$friend_arr = array(); 
while ($row = mysql_fetch_array($result)) { 
    $friend_arr[] = $row[0]; 
} 

$friend_list = implode(',', $friend_arr); 

Đăng mã PHP bạn đang sử dụng để chạy truy vấn và chúng tôi sẽ có thể trợ giúp thêm.

Một vài lưu ý:

  • tôi thêm mysql_real_escape_string chức năng. Vệ sinh đầu vào của người dùng theo cách này là quan trọng để tránh các cuộc tấn công SQL injection.
  • Tùy thuộc vào những gì bạn đang thực sự làm - có một cơ hội tốt để lưu trữ danh sách chuỗi được phân cách bằng dấu phẩy không phải là cách hay để thực hiện.
Các vấn đề liên quan