2011-07-26 258 views
2

考虑以下两个表:这个mySQL查询有什么问题?

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 

编辑:我用笨的活动记录查询,但我基本的SQL格式写的,这样,如果有人不使用CodeIgniter fimiliar可以提供帮助。然而,这个查询在简单的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(); 
+0

我认为tag_links必须与tag_names保持连接,而不是tag_names与tag_links。 –

+0

编辑我的答案。 – avall

回答

2

试试这个:

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说法正确)加入表所使用。

编辑:我有两个想法如何摆脱这个问题:

第一: 更改线路与SELECT

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

二: 使用select()与完整的查询功能:

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

$ T his-> db-> select()接受一个可选的第二个参数。如果您将 设置为FALSE,则CodeIgniter将不会尝试使用反引号来保护您的字段或表 名称。如果您需要复合选择 声明,这很有用。

来自:http://codeigniter.com/user_guide/database/active_record.html#select

+0

谢谢,对不起,我忘了在这里,但它不是问题。正如我编辑我的帖子,并提到这个查询工作正常与简单的MySQL语法,但即时通讯尝试与CodeIgniter活动记录,这给出了奇怪的结果。 – Roman

+0

非常感谢您付出精力解决问题。然而,问题是由我的愚蠢造成的,我没有注意到,在我的模型函数中,我返回了'$ query-> row();',而不是'$ query-> result();'这是因为我有只是从我的其他功能复制代码。但感谢你的时间,我接受你的答案。 – Roman

1
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中进行选择,然后在其上加上标签的名称,以便正确地从包含多个条目的表中进行选择。

2

看来你有一个语法错误(您忘记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 
+0

由于WHERE语句不允许,因此得到不正确的结果是错误的。 – avall

+0

@avall理论上是。但这不是一个好的做法,依靠意外的黑客代码:) – Karolis

+0

我同意。过了一段时间,代码更难维护。 – avall