所以我一直想知道一段时间。 为什么我会在我的查询中使用每个值前面的字母? 在数据库中,每个值都没有字母前面。
$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)
";
我试过看,但我找不到它。
答案 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'。否则很难确定哪个列属于哪个表,尤其是当您有公共表列时。