php mysql сравнивает возвращаемые значения checboxes со значениями полей - PullRequest
0 голосов
/ 26 августа 2011

У меня есть форма, которая отправляет выбранные значения из списка флажков в скрипт 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;

, чтобы набор записей мог указывать количество пользователей, говорящих на английском, / и итальянском, и / или французском языках, по коду страны

Объем существующего набора данных очень велик. Создать отдельную таблицу соединений users_languages? Есть ли в MySQL инструкция для этого? Создать пользовательскую функцию в MySQL?

Большое спасибо. Eric

Ответы [ 2 ]

2 голосов
/ 26 августа 2011
$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 голос
/ 26 августа 2011

Объем существующего набора данных очень велик. Создать отдельную таблицу соединений users_languages?

Да, это лучший вариант, потому что MySQL может затем использовать индекс для быстрого поиска строк.

Есть ли инструкция mysql для этого?

да, find_in_set см. @ Ответ Андрея.

Создать ли пользовательскую функцию в mySQL?

Нет, это убьет любую опцию, которую MySQL должен использовать индексы.

...