2016-07-18 5 views
1

У меня есть таблица «один ко многим» со структурой «id, user_id, skill». Пользователь может иметь несколько навыков, например «mysql» и «php».Mysql - поиск в таблице «один ко многим»

Когда кто-то хотел бы найти пользователя с навыками «php» и «mysql», следует написать в форме поиска «php mysql».

Я сделал некоторый запрос MYSQL (условие): "... WHERE skill LIKE '%php%' AND skill LIKE '%mysql%'", но он ничего не возвращает.

Как я могу улучшить это?

Также я пробовал что-то вроде "WHERE CONCAT_WS(' ', skill) LIKE '%php%' AND CONCAT_WS(' ', skill) LIKE '%mysql%'". Это тоже ничего не возвращает.

Благодарим за помощь!

ответ

1

Использование условной агрегации:

SELECT t1.id, t1.name 
FROM users t1 
INNER JOIN 
(
    SELECT s.user_id 
    FROM skills s 
    GROUP BY s.user_id 
    HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR 
         s.skill LIKE '%mysql%' THEN 1 ELSE 0 END) >= 2 
) t2 
    ON t2.user_id = t1.id 

внутренний запрос находит пользователей, которые имеют как PHP и MySQL мастерство, и этот результат затем используется для фильтрации users таблицы возвращать только имена, которые соответствуют этому требованию.

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

SQLFiddle

Update:

Если skills таблица может иметь один и тот же навык, указанный для данного пользователя несколько раз, вы можете игнорировать эти повторяющиеся записи, используя DISTINCT:

SELECT t1.id, t1.name 
FROM users t1 
INNER JOIN 
(
    SELECT s.user_id 
    FROM (SELECT DISTINCT user_id, skill FROM skills) s 
    GROUP BY s.user_id 
    HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR s.skill LIKE '%mysql%' 
       OR s.skill LIKE '%javascript%' THEN 1 ELSE 0 END) >= 3 
) t2 
    ON t2.user_id = t1.id 

Обратите внимание, что в «Скрипке» ниже отметка «Марк» не отображаются в результирующем наборе, как Хотя у него PHP как навык, перечисленный дважды, у него нет ни MySQL, ни JavaScript.

SQLFiddle

+0

Он никогда и ничего не возвращают. Пожалуйста, посмотрите здесь, я просто сделал SQL-схему http://sqlfiddle.com/#!9/5008a6/1 – Ridd

+1

@Ridd Я думаю, вы хотите использовать оператор 'OR', а не' AND'. Проверьте мое обновление. –

+0

Это работает, отлично! Спасибо. Это сложнее, но я надеюсь, что это тоже эффективно и не убьет мой db :) Еще раз спасибо. – Ridd

0

регулярное выражение может быть более эффективным, но вы должны были бы эталоном это, чтобы быть уверенным, например,

SELECT * from table where field REGEXP 'php|mysql'; 

For Ref.

+0

Это даст ритуал php или mysql? и нам нужны php и mysql –

+0

Это будет работать как операция «% keyword%». ex: У меня есть db с пользовательской таблицей, и я хочу искать по id электронной почты. SELECT * от пользователя, где username REGEXP 'bhavin | kenny'; Но у меня есть значение в столбце с «bhavin @ tech» и «kenny @ tech» –

+0

Но это инструкция OR, а не обряд утверждения AND? –

Смежные вопросы