Что не так с этим запросом mySQL? - PullRequest
2 голосов
/ 26 июля 2011

Рассмотрим следующие две таблицы:

tag_names (tag_id, tag_name)
tag_links (tag_id, image_id)

Изображение может иметь несколько тегов, я хочу выбрать все теги для определенного идентификатора изображения. Я пытаюсь выполнить следующий запрос, но, похоже, он не выбран правильно (выбирается только одна строка). Что с ним не так?

SELECT tag_name
FROM tag_names
LEFT JOIN tag_links.tag_id = tag_names.tag_id
WHERE tag_links.image_id = $image_id

Редактировать: я использую запрос активной записи CodeIgniter, но я написал в базовом формате SQL, так что если кто-то не знаком с CodeIgniter, может помочь. Однако этот запрос прекрасно работает с простым форматом mysql (без использования CodeIgniter), но странным образом не работает с CodeIgniter, даже если с синтаксисом нет никаких проблем, он просто выбирает одну строку.

Вот синтаксис CodeIgniter:

$this->db->select('tag_name');
$this->db->from('tag_names');
$this->db->join('tag_links', 'tag_links.tag_id = tag_names.tag_id', 'left');
$this -> db -> where('tag_links.image_id', (int)$image_id);     
$query = $this->db->get();

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Попробуйте:

SELECT tag_name
FROM tag_names
LEFT JOIN tag_links
ON tag_links.tag_id = tag_names.tag_id
WHERE tag_links.image_id = $image_id

ИМХО вы забыли присоединиться к используемой вами таблице (правильно с ON оператором).

РЕДАКТИРОВАТЬ: У меня есть 2идеи, как избавиться от проблемы:

Первый: изменить строку с помощью SELECT

$this->db->select('tag_names.tag_name');

Второй: использовать функцию select () с полным запросом:

$this->db->select($query, false);

$ this-> db-> select () принимает необязательный второй параметр.Если вы установите значение FALSE, CodeIgniter не будет пытаться защитить имена полей или таблиц обратными галочками.Это полезно, если вам нужен составной оператор выбора.

из: http://codeigniter.com/user_guide/database/active_record.html#select

2 голосов
/ 26 июля 2011

Похоже, у вас есть синтаксическая ошибка (вы забыли tag_links в предложении JOIN).Кстати, на мой взгляд, вам не нужно LEFT JOIN для этой цели, иначе вы можете получить неправильные результаты.

SELECT tag_name
FROM 
    tag_names
    JOIN tag_links ON tag_links.tag_id = tag_names.tag_id
WHERE tag_links.image_id = $image_id
1 голос
/ 26 июля 2011
SELECT tag_names.tag_name
FROM tag_links
LEFT JOIN tag_names.tag_id = tag_links.tag_id
WHERE tag_links.image_id = $image_id

tag_names будет иметь только одну запись для данного идентификатора, что означает, что ваш запрос будет возвращать один результат. Вам нужно в первую очередь выбрать из tag_links и затем присоединить имя тега поверх него, чтобы вы правильно выбрали из таблицы с несколькими записями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...