此查询有效:
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...
答案 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以取得之前的那个;)
感谢大家的帮助。