我有一个表单,通过这种方式将复选框列表中的选定值发送到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中创建用户功能吗?
非常感谢。埃里克
答案 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必须使用索引的任何选项。