为什么在mysqli查询中使用每个值的字母?

时间:2015-05-12 11:02:09

标签: php mysql mysqli

所以我一直想知道一段时间。 为什么我会在我的查询中使用每个值前面的字母? 在数据库中,每个值都没有字母前面。

$sql = "
    SELECT c.client_id, c.client_name, c.contactperson, c.internal_comment, 
    IF NULL(r.region, 'Alle byer') as region, c.phone, c.email,
    uu.fullname as changed_by, 
    (select count(p.project_id) 
        from projects p 
        where p.client_id = c.client_id and (p.is_deleted != 1 or p.is_deleted is null)
    ) as numProjects 
    FROM clients c LEFT JOIN users uu ON c.db_changed_by = uu.id 
    LEFT JOIN regions r ON c.region_id = r.region_id 
    WHERE (c.is_deleted != 1 or c.is_deleted is null)
    ";

我试过看,但我找不到它。

3 个答案:

答案 0 :(得分:4)

在SQL中,您需要为查询使用多个表,您可以这样做:

SELECT person.name, vehicle.id FROM person, vehicle;

或者你可以做得更小,像这样放

SELECT p.name, v.id FROM person p, vehicle v;

它仅用于减少查询长度,对您有用

答案 1 :(得分:2)

通过“前面的字母”,我假设您指的是c.uu.列上的限定符,依此类推。它们表示列来自的表。从某种意义上说,它们是专栏定义的一部分。

这是您的查询:

SELECT c.client_id, c.client_name, c.contactperson, c.internal_comment,
       IF NULL(r.region, 'Alle byer') as region, c.phone, c.email,
       uu.fullname as changed_by,
       (select count(p.project_id)
        from projects p
        where p.client_id = c.client_id and (p.is_deleted != 1 or p.is_deleted is null)
       ) as numProjects
FROM clients c LEFT JOIN
     users uu
     ON c.db_changed_by = uu.id LEFT JOIN
     regions r
     ON c.region_id = r.region_id
WHERE (c.is_deleted != 1 or c.is_deleted is null)

在某些情况下,需要这些。考虑on子句:

 ON c.region_id = r.region_id

如果你遗漏了,你有:

ON region_id = region_id

SQL编译器无法解释这一点,因为它不知道region_id来自何处。是clients还是regions?如果您在select中使用此功能,则会出现同样的问题 - 因为left join会产生影响。在相关子查询中也是如此。

通常,优良作法是限定列名称有以下几个原因:

  • 查询是明确的。
  • 您(和其他人)很容易知道列的来源。
  • 如果修改查询并添加新的表/子查询,则无需担心命名冲突。
  • 如果基础表被修改为具有与其他表共享的新列名,则查询仍将进行编译。

答案 2 :(得分:0)

考虑您正在访问2个表,并且两个表都具有相同的列名称' Id',在查询中,如果第一个表具有别名,您可以使用a.Id == d.Id等字母轻松识别这些列'一个'和第二个表' b'。否则很难确定哪个列属于哪个表,尤其是当您有公共表列时。