То, что вы можете / должны структурировать свою базу данных по-другому, уже упоминалось (см. http://en.wikipedia.org/wiki/Database_normalization). Но ....
См. FIND_IN_SET ()
mysql> SELECT FIND_IN_SET ('b', 'a, b, c, d');-> 2
например,
<?php
$mysql = init();
bar($mysql, 1);
bar($mysql, 2);
bar($mysql, 3);
bar($mysql, 4);
function bar($mysql, $x) {
$sql_x = mysql_real_escape_string($x, $mysql);
$result = mysql_query("SELECT id, foo FROM soTest WHERE FIND_IN_SET('$sql_x', foo)", $mysql) or die(mysql_error());
echo "$x:\n";
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
echo $row['id'], ' ', $row['foo'], "\n";
}
echo "----\n";
}
function init() {
$mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error());
mysql_select_db('test', $mysql) or die(mysql_error());
mysql_query('CREATE TEMPORARY TABLE soTest (id int auto_increment, foo varchar(64), primary key(id))', $mysql) or die(__LINE__.' '.mysql_error());
mysql_query("INSERT INTO soTest (foo) VALUES ('1,2,3'), ('2,4'), ('3'), ('2,3'), ('1,2')", $mysql) or die(__LINE__.' '.mysql_error());
return $mysql;
}
print
1:
1 1,2,3
5 1,2
----
2:
1 1,2,3
2 2,4
4 2,3
5 1,2
----
3:
1 1,2,3
3 3
4 2,3
----
4:
2 2,4
----
MySQL не может использовать индексы для выполнения этого поиска, то есть в результате запроса выполняется полное сканирование таблицы,см. Оптимизация запросов с помощью EXPLAIN
edit:
Для вашего второго вопроса вам нужно только изменить WHERE-предложение на
WHERE FIND_IN_SET('$sql_x', foo)=1