2013-05-06 2 views
1

Я хочу иметь возможность запрашивать несколько операторов, когда у меня есть таблица, которая соединяет идентификатор из двух других таблиц.Запрос для нескольких условий в MySQL

Моих три таблиц

destination: 
id_destination, name_destination 

keyword: 
id_keyword, name_keyword 

destination_keyword: 
id_keyword, id_destination 

Где последний соединяется идентификаторы от и назначений-таблицы ключевых слов для того, чтобы связать назначения с ключевыми словами.

Запрос, чтобы получить назначение, основываясь на ключевых слов будет выглядеть

SELECT destination.name_destination FROM destination 
      NATURAL JOIN destination_keyword 
      NATURAL JOIN keyword 
      WHERE keyword.name_keyword like _keyword_ 

Можно ли запросить несколько ключевых слов, скажем, я хотел, чтобы получить назначения, который соответствует всем или некоторым из ключевых слов список sunny, ocean, fishing и порядок по количеству матчей. Как я буду двигаться вперед? Должен ли я реструктурировать свои таблицы? Я как бы новичок в SQL и очень хотел бы внести свой вклад.

+0

Значения 'name_keyword' являются единственными словами типа« солнечный »? – Bohemian

+0

Это единичные слова, да. – Martol1ni

ответ

1

Заказать Ваш стол присоединяется начиная с keyword и использовать счетчик на количество времени соединяется назначения:

select 
    d.id_destination, 
    d.name_destination, 
    count(d.id_destination) as matches 
from keyword k 
join destination_keyword dk on dk.keyword = k.keyword 
join destination d on d.id_destination = dk.id_destination 
where name_keyword in ('sunny', 'ocean', 'fishing') 
group by 1, 2 
order by 3 desc 

Этот запрос предполагает, что name_keyword значения отдельных слов, как «солнечный».


Используя естественные соединения не является хорошей идеей, потому что, если изменить табличные структуры таким образом, что два естественно соединенные таблицы получить измененное иметь столбцы, добавленные таким же именем, вдруг ваш запрос перестанет работать. Кроме того, явным образом объявляя условие объединения, читатели вашего кода сразу поймут, как эти таблицы являются jones, и могут модифицировать его, чтобы добавить не-ключевые условия по мере необходимости.

Требование того, что только ключевые столбцы имеют одно и то же имя, также является ограничительным, поскольку для него требуются неестественные имена столбцов, такие как «имя_пользователя», а не просто «имя» - суффикс «_keyword» является избыточным и не добавляет значения и существует только потому, что ваш есть, потому что вы используете естественные соединения.

Природные соединения сохраняют практически любую набирающую (и часто вызывают больше, набрав все) и налагают ограничения на типы и названия соединений и являются хрупкими.

Их следует избегать.

+0

Спасибо, что отлично работает. Я был не уверен, что я извлекаю из нескольких строк и сравниваю их. Можно ли также отображать отдельные матчи? Также выберите ключевые слова, которые соответствуют, например, «солнечный», «океан». - И слово 'name_keyword' - это одно слово, да. – Martol1ni

0

Вы можете попробовать что-то вроде следующего:

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword 
AND dest_key.id_destination = dest.id_destination 
AND key.name_keyword IN ('sunny', 'ocean', 'fishing') 
GROUP BY dest.name_destination 
ORDER BY count(*), dest.name_destination 

Не проверял, но если это не исправить это должно показать вам способ сделать это.

+0

Я думаю, что OP хочет сделать LIKE-матч. Таким образом, ваше решение не будет работать, так как LIKE не работает с IN. – Nabheet

+0

@NabheetSandhu Ну, проверяя ответ, который он назвал правильным, кажется, ему не нужен LIKE. – drewich

+0

drewich, вы правы. Извиняюсь! – Nabheet

0

Вы можете сделать несколько заявлений, как:

Column LIKE 'value1' OR Column LIKE 'value2' OR ... 

Или вы могли бы сделать соответствие регулярного выражения:

Column LIKE 'something|somtthing|whatever' 

Хитрости упорядоченности по количеству матчей имеет отношение к пониманию GROUP BY и предложение ORDER BY. Вы либо хотите, чтобы каждый подсчитывал все, или вы хотите, чтобы один счет за что-то. Поэтому для первого случая вы просто используете функцию COUNT. Во втором случае вы используете предложение GROUP BY, чтобы «группировать» что-то/категории, которые вы хотите подсчитать. ORDER BY должен быть довольно прямым.

Я думаю, что на основе информации, предоставленной вами, ваша структура таблицы в порядке.

Надеюсь, это поможет.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Мой синтаксис не является точным.

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