2012-06-11 29 views
5

Al momento ho una tabella di MySQL come:MySQL dati di colonna restituito come delimitato da virgole lista

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

sto cercando di afferrare tutti gli amici id di un particolare utente e disporle in un elenco delimitato da virgole. Ad esempio, ha afferrato gli amici di user1, sarebbe di ritorno,

$friend_list = 2,5,10 

Attualmente, ho:

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

Questo afferra solo una riga though..please aiutare!

Grazie

+0

Sono piuttosto fortemente contro 'GROUP_CONCAT' - mi sembra un uso improprio di un motore di database. – jnylen

+1

@jnylen - Non so perché, non ci sono note cautelative da parte della gente di MySQL, la domanda è stata codificata con MySQL, non con PHP. -Per ciascuno il suo amico, solo dicendo :) – GDP

+0

@GregP Immagino che sia perché le operazioni del database devono manipolare e restituire tabelle di dati - non dovrebbero trattare tipi di dati "fasulli" come una stringa separata da virgole, quindi è una cattiva "codice odore" per me. Ogni volta che hai un elenco delimitato da virgole, dovresti probabilmente lasciarlo in righe o in un array. Ecco un buon esempio dei problemi che si possono affrontare: http: // StackOverflow.it/questions/6643656/mysql-comma-delimited-list-possible-to-add-and-remove-values? rq = 1 – jnylen

risposta

12

che si desidera utilizzare group_concat:

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

Rettificato per correttezza per la risposta migliore.

+1

menzionabile: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_group_concat_max_len – goat

+1

E ovviamente puoi specificare il delimitatore in GROUP_CONCAT :) –

+0

@WojtekT fornisce molto meglio rispondi ... – GDP

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

Probabilmente si sta cercando GROUP_CONCAT(column) funzione. Esempi here e here.

0

Ho usato una variabile chiamata @a, per memorizzare i ids, alla fine si hanno i valori della variabile o provare con un limite, l'ordine di gruppo da, in questo modo:

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) 

Nella tua caso cambiare la "condizione WHERE"

o si può anche dopo il select:

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

vostra query restituirà più di una riga - sembra che tu stai leggendo solo il prima riga. Volete qualcosa di simile a questo, invece:

$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); 

pubblicare il codice PHP che si sta utilizzando per eseguire la query e saremo in grado di aiutare di più.

Un paio di note:

  • ho aggiunto la funzione mysql_real_escape_string. La sanificazione degli input dell'utente in questo modo è cruciale per evitare gli attacchi SQL injection.
  • A seconda di cosa si sta effettivamente facendo - ci sono buone probabilità che l'archiviazione di un elenco di stringhe separate da virgole non sia un buon modo per farlo.
Problemi correlati