SQL: помогите с объединениями sql

0

Привет У меня есть приложение, которое имеет сообщения, теги и таблицу ссылок tag_ref. Я хочу запросить сообщения, имеющие определенную ассоциацию тегов.

Структура базы данных выглядит следующим образом:

сообщения

ID

tags_ref

row_id

Таблица

tag_id

теги

ID

safe_tag

тег

Мой запрос в основном идет, если $safe_tag не равен null, тогда присоединяем tags_ref к post.id = tags_ref.row_id, добавляем теги к тегам_ref.tag_id = tags.id, где tags_ref.table = 'posts' и tags.safe_tag = ' food 'и post.city_id = 2

Правильно ли этот запрос? Я использую правильный тип соединения?

SELECT *
FROM (`posts`)
INNER JOIN `tags_ref` ON `posts`.`id` = `tags_ref`.`row_id`
INNER JOIN `tags` ON `tags_ref`.`tag_id` = `tags`.`id`
WHERE `tags_ref`.`table` = 'posts'
AND `tags`.`safe_tag` = 'food'
AND `posts`.`city_id` = '2' 

Я получаю нечетные результаты, у которых вообще нет тегов.

Спасибо

  • 0
    Почему вы цитируете все имена таблиц и столбцов? Вы имели в city_id ограничение city_id ?
  • 0
    @Oded, это распечатка из функции профилирования codeigniter
Теги:
join

1 ответ

1
Лучший ответ

Это приведет к возврату результатов из таблицы posts, в отличие от всех столбцов в таблицах соединений. Я удалил ограничение city_id, которое вы не указали в тексте вопроса (и это было в вашем запросе):

SELECT P.*
FROM posts AS P
  INNER JOIN tags_ref AS TR ON P.id = TR.row_id
  INNER JOIN tags AS T ON TR.tag_id = T.id
WHERE TR.table = 'posts'
AND T.safe_tag = 'food'

Я также добавил псевдонимы таблицы и удалил цитату.

Если вы не получите никаких результатов, это предложит мне, что нет сообщений с food.

  • 0
    Ваш запрос работает, хотя я хочу иметь ограничение city_id. Каждое сообщение имеет поле city_id, которое не является нулевым. Чем отличается ваш запрос от моего? Я ничего не вижу кроме алиасов
  • 0
    @iamjonesy - ничем не отличается, кроме различий, отмеченных выше. Однако, если ваш city_id является целочисленным типом, вы должны запросить его без кавычек: AND P.city_id = 2 . Если это все еще не работает, проверьте свои данные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню