mysql如果查询中的条件无法从mysql_field_table获取tablename

时间:2010-07-14 20:51:28

标签: mysql

此查询有效:

SELECT Article.id, 
       Article.post_time, 
       Article.post_locked, 
       Article.comments_locked, Article.title,  
       IF(CHAR_LENGTH(Article.content)>2000, 
          RPAD(LEFT(Article.content,2000),2003,'.'), 
          Article.content) as content, 
       Article.tags, Category.*, 
       User.id, User.user_name, 
       Comment.comment_count 
  FROM `articles` as `Article` 
LEFT JOIN `categories` as `Category` ON `Article`.`category_id` = `Category`.`id` 
LEFT JOIN `users` as `User` ON `Article`.`user_id` = `User`.`id` 
LEFT OUTER JOIN (SELECT article_id, count(*) comment_count FROM `comments`) as `Comment` ON `Article`.id = `Comment`.article_id 
    WHERE '1'='1' 
 ORDER BY `Article`.`id` DESC

但是当我循环遍历结果集以使用'mysql_field_table'将字段名称与字段一起分配时,'content'返回表名称为nothing,而其他所有其他表都有正确的表:

Array ( 
    [0] => Article 
    [1] => Article 
    [2] => Article 
    [3] => Article 
    [4] => Article 
    [5] => 
    [6] => Article 
    [7] => Category 
    [8] => Category 
    [9] => User 
    [10] => User 
    [11] => Comment )

使用

for ($i = 0; $i < $numOfFields; ++$i) {
   array_push($table,mysql_field_table($this->_result, $i));
   array_push($field,mysql_field_name($this->_result, $i));
}

有人试过这样做吗?有解决方案吗?我想在查询中从我的数据库返回更少的数据。或者只是选择所有内容并通过PHP截断内容不那么密集(在mysql,内存,cpu上)?我认为从DB中返回更少会更好。

非常感谢!

和平。

修改

要清理,这就是结果,你会明白为什么它不是我想要的:

Array ( 
    [0] => Array ( 
        [Article] => Array ( 
            [id] => 8 
            [post_time] => 1278606312 
            [post_locked] => 0 
            [comments_locked] => 0 
            [title] => Article 8
            [tags] => test ) 
        [] => Array ( 
            [content] => my content for Article  ) 
        [Category] => Array ( 
            [id] => 2 
            [name] => cat2 ) 
        [User] => Array ( 
            [id] => 3 
            [user_name] => user3 ) 
        [Comment] => Array ( 
            [comment_count] => 1 ) 
    ) 
   [1] => Array ( 
        [Article] => Array ( 
            [id] => 7 
etc...

5 个答案:

答案 0 :(得分:1)

你不能使用类似as [tablename].[columnname]的格式来自定义列名。

如果它可行,那将是奇怪的,因为如果内容不是Article表数据集的真正部分,那么如何将内容定义为'Article.content'。

只需选择您需要的列并在需要的地方加入。

WHERE '1' = '1'在那里做什么?只会评估为true,因为它是一个布尔表达式,但它不会影响你的结果集。

答案 1 :(得分:1)

为了使用英文字母以外的字符和列别名中的空格,标准SQL意味着需要使用双引号(虽然MySQL支持使用反引号IE:“”“):

...,
IF(CHAR_LENGTH(Article.content)>2000, 
   RPAD(LEFT(Article.content,2000),2003,'.'), 
   Article.content) AS "Article.content", 
...

答案 2 :(得分:1)

  

但是当我遍历结果集时   分配表名称   使用'mysql_field_table'的字段,   'content'返回一个表名   没有,而所有其他人都有他们的   正确的表

一旦你在Article.content上完成了这个魔术,要创建内容字段,它就不再属于Article表。相反,它属于该查询的结果集。我相信这是没有与该领域相关联的表格的解释。

想象一下GROUP BY查询,其中包含COUNT(*) as number之类的内容。 'number'不属于任何表。

答案 3 :(得分:0)

如果你真的需要知道该列有特定来源的能力,你是否可以在文章之上有一个对内容进行操作的视图?然后来源似乎是视图?不幸的是,MySQL不支持表中声明的计算列,在这种情况下也可能对你有用。

答案 4 :(得分:0)

while ($row = mysql_fetch_row($this->_result)) {
    $prev_table;
    for ($i = 0;$i < $numOfFields; ++$i) {
        if ($table[$i] == "") {
            $tempResults[$prev_table][$field[$i]] = $row[$i];
        }else {
            $tempResults[$table[$i]][$field[$i]] = $row[$i];    
        }
        $prev_table = $table[$i];
    }
}

哦,好吧,mysql不能做我想要的。我添加了prev_table以取得之前的那个;)

感谢大家的帮助。

相关问题