【问题标题】:What's wrong with this mySQL query?这个 mySQL 查询有什么问题?
【发布时间】:2011-07-26 08:44:31
【问题描述】:

考虑以下两个表:

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 活动记录查询,但我以基本 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();

【问题讨论】:

  • 我认为 tag_links 必须与 tag_names 连接,而不是 tag_names 与 tag_links。

标签: mysql join


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢,对不起,我忘了把 ON 放在这里,但这不是问题。当我编辑我的帖子并提到这个查询使用简单的 mysql 语法时可以正常工作,但我尝试使用 CodeIgniter 活动记录,这会产生奇怪的结果。
  • 非常感谢您投入精力来解决问题。但是,问题是由我的愚蠢引起的,我没有注意到在我的模型函数中,我返回的是$query->row();,而不是$query->result(); 这是因为我刚刚从我的其他函数中复制了代码。但感谢您的宝贵时间,我接受您的回答。
【解决方案2】:

您似乎有语法错误(您在 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

【讨论】:

  • 你得到不正确的结果是错误的,因为 WHERE 语句不允许这样做。
  • @avall 理论上是的。但是依靠带有意外黑客的代码并不是一个好习惯:)
【解决方案3】:
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中进行选择,然后在其顶部加入标签名称,这样您才能正确地从包含多个条目的表中进行选择。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多