繁体   English   中英

这个mySQL查询有什么问题?

[英]What's wrong with this mySQL query?

考虑以下两个表:

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

一个图像可以有多个标签,我想为一个特定的图像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 Active记录查询,但是我以基本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();

尝试这个:

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

看来您有语法错误(您在JOIN子句中忘记了tag_links )。 顺便说一句,我认为您不需要为此目的而使用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
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仅将具有给定ID的单个条目,这意味着您的查询将返回单个结果。 您首先需要从tag_links选择,然后在其顶部加入标签的名称,因此您可以从具有多个条目的表中正确选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM