php mysql compare复选框返回带字段值的值

时间:2011-08-26 10:15:25

标签: php mysql sql comparison group-by

我有一个表单,通过这种方式将复选框列表中的选定值发送到php脚本:

$selected_languages=$_POST["selected_languages"]; // --> "en-GB,it,fr"

我的'帐户'mysql表有一个名为'spoken_languages'的字段,其中包含每个用户所说语言的代码列表。该字段是VARCHAR字段,并以这种方式保存代码:

en-US,ru,fr

我想选择所有在$ selected_languages中使用任何所选语言的用户,但我没有找到一种有效而快捷的方法来做类似的事情:

SELECT 
COUNT(accounts.user_id) as users_number, 
countries.country_name 
FROM accounts, countries 
WHERE accounts.country_code=countries.country_code

以及以下内容:

AND $selected_languages IN accounts.spoken_languages 

然后:

GROUP BY countries.code;

以便记录集可以通过country_code提供说英语或/和意大利语/ /和法语组的用户数

现有数据集的数量非常大。我是否创建了一个单独的连接表users_languages?有没有mysql指令呢?我在mySQL中创建用户功能吗?

非常感谢。埃里克

2 个答案:

答案 0 :(得分:2)

$langs = explode(',', $selected_languages);

foreach($langs as $lang) {
    $res[] = " FIND_IN_SET('". mysql_escape_string($lang) . "', accounts.spoken_languages)";
}

$query = 'SELECT 
    COUNT(accounts.user_id) as users_number, 
    countries.country_name 
    FROM accounts, countries 
    WHERE accounts.country_code=countries.country_code 
    AND (' . implode(' OR ', $res) . ') GROUP BY countries.code;';

 //execute $query

注意:我认为在大数据集上它应该很慢。

答案 1 :(得分:1)

  

现有数据集的数量非常大。   我是否创建了一个单独的连接表users_languages?

是的,这是最好的选择,因为MySQL可以使用索引快速查找行。

  

有没有mysql指令呢?

是的,find_in_set看@ Andrej的回答。

  

我在mySQL中创建用户函数吗?

不,它会杀死MySQL必须使用索引的任何选项。