MySQL语法解释

3
我想知道a.*, c.name, ... a.access等的含义。换句话说,当我在点号前面加一个字母并使用点号时,我到底是在引用什么,点号的作用是什么。
以下是我发现这种情况的代码示例:
$query = "SELECT a.*, c.name as categoryname,c.id as categoryid, ".
         "c.alias as categoryalias, c.params as categoryparams".
        " FROM #__k2_items as a".
        " LEFT JOIN #__k2_categories c ON c.id = a.catid";

        $query .= " WHERE a.published = 1"
        ." AND a.access <= {$aid}"
        ." AND a.trash = 0"
        ." AND c.published = 1"
        ." AND c.access <= {$aid}"
        ." AND c.trash = 0"
        ;

#__k2_items是指什么?#是MySQL的注释分隔符,我很确定表名在SQL查询中不是字面意思。 - BoltClock
@Bolt:这是Joomla中用来替换数据库前缀的占位符。 #__ 将被该安装程序中存储的前缀所替代(由配置文件定义)... - ircmaxell
7个回答

6

如果您查看FROM子句,您会看到以下内容:

FROM #__k2_items as a

LEFT JOIN 子句中,你会看到这个:

LEFT JOIN #__k2_categories c ON c.id = a.catid

这个将#__k2_items表(实际名称不确定)的别名设置为a,将#__k2_categories的别名设置为c。这只是为了节省输入并提高查询的可读性。

点号将列名与表名关联起来,以便MySQL知道在查询中涉及多个具有相同列名的表时应该查找哪些表。也就是说,它解决了列模糊性问题。


3

a.Something指的是表格a中的列Something。在您的语句中,您对表格进行了别名:

FROM #__k2_items as a LEFT JOIN #__k2_categories c

#__k2_items被命名为别名a#__k2_categories被命名为别名c

因此,SELECT a.*,c.name as categoryname,c.id as categoryid,c.alias as categoryalias,c.params as categoryparams将选择#__k2_items中的所有字段以及#__k2_categories中的idaliasparams字段。

希望这有所帮助。


1

它们是表名。因此,您还要匹配表名:a 是所有名称与 #__k2_items 匹配的表。


通常有人比我快七秒钟! :-) - winwaed

0

你正在为你的表/视图设置别名。"FROM #__k2_items as a" 意味着 #__k2_items 将被称为 "a" 别名,因此你不必使用长表名。

这样做:

SELECT a.*, c.name as categoryname,c.id as categoryid, ...

意思与此相同:

SELECT #__k2_items.*, #__k2_categories.name as categoryname, #__k2_categories.id as categoryid, ...

0

点号前面的单词是表名,后面的单词是列名。在这个例子中,a 被转换为 #__k2_itemsc 被转换为 #__k2_categories。这样做可以使 SQL 更短、更易读。


0
  • a.*:从表a中选择所有字段,实际上是指具有不同别名的表'#__k2_items',该别名由'as'关键字指定。
  • c.name和其他类似的表达式:从表'c'中选择字段'name',这又是表#__k2_categories。
  • c.alias as categoryalias和其他类似的表达式:将c.alias中的字段'alias'重命名(别名)为'categoryalias'。

基本上,正如其他人已经说过的:

  • 点号前面的任何内容都是表名,点号后面的任何内容都是字段名。
  • 'as'语句用于更改名称。这对于在SQL查询的输出中具有有用的名称非常有用。例如,您可能正在从两个表中选择两个平均值,其中一个是博士生平均值,另一个是硕士生平均值,因此您可以更改字段的名称,以便更容易理解哪个平均值来自哪个表。
  • 有时为了使语法更简单,特别是当您从许多表中选择字段时,会像'a'和'c'一样将表重命名。

-2
如何将记录插入到表格 #__k2_items 中:
$db = &JFactory::getDBO();

$query = "INSERT INTO jos_k2_items (`title`, `alias`, `catid`, `published`,
         `introtext`, `fulltext`, `video`, `gallery`, `extra_fields`,
         `extra_fields_search`, `created`, `created_by`, `created_by_alias`,
         `checked_out`, `checked_out_time`, `modified`, `modified_by`,
         `publish_up`, `publish_down`, `trash`, `access`, `ordering`, `featured`,
         `featured_ordering`, `image_caption`, `image_credits`, `video_caption`,
         `video_credits`, `hits`, `params`, `metadesc`, `metadata`, `metakey`,
         `plugins`)
         VALUES
         ('".$title."', '".$title."', ".$catid.", 0, '<p>".$introtext."</p>',
          '', NULL, NULL, '".$extra_fields."', 'extra_fields_search', now(), 62,
          '', 0, '0000-00-00 00:00:00', '', 62, '', '0000-00-00 00:00:00', 0, 0,
          5, 0, 0, '', '', '', '', 0, '', '', 'robots=\nauthor=', '', '')
";

$db->setQuery($query);
$db->query();  

-0.5 分,因为没有对参数进行 SQL 转义。-0.5 分,因为硬编码了前缀。 - cHao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接