SELECT
ORDER_ITEM.OrderID,
ORDERS.OrderDate
FROM ORDER_ITEM LEFT JOIN ORDERS
ON ORDER_ITEM.OrderID = ORDERS.OrderID
LEFT JOIN PEOPLE
ON ORDERS.CustomerID = PEOPLE.PeopleId AND ORDERS.EmployeeID = PEOPLE.PeopleId
where PEOPLE.FirstName + PEOPLE.LastName = 'April Roberts'
我的结果是输出0行。不知道我在这里做错了什么。
答案 0 :(得分:0)
确保表格中的数据符合您的条件。例如你有一个名叫April Roberts的人的命令。如果您使用LEFT JOIN,则查询将返回所有结果,即使您没有该人的任何订单。因此,如果您只想要与此人联系的订单,INNER JOIN或简单地加入就可以了。
SELECT oi.OrderID, o.OrderDate
FROM ORDER_ITEM oi
JOIN ORDERS o ON oi.OrderID = o.OrderID
JOIN PEOPLE p ON o.CustomerID = p.PeopleId
WHERE p.FirstName = 'April' AND p.LastName = 'Roberts'
答案 1 :(得分:0)
这应该更适合搜索(你使用的空间不存在)
SELECT OI.OrderID, O.OrderDate
FROM ORDER_ITEM OI
LEFT JOIN ORDERS O ON OI.OrderID = O.OrderID
LEFT JOIN PEOPLE P ON O.CustomerID = P.PeopleId AND O.EmployeeID = P.PeopleId
WHERE P.FirstName='April' AND P.LastName = 'Roberts';
但是,从逻辑上讲,CustomerID和EmployeeID不能匹配同一个员工。您需要第二个链接到人
SELECT OI.OrderID, O.OrderDate
FROM ORDER_ITEM OI
LEFT JOIN ORDERS O ON OI.OrderID = O.OrderID
LEFT JOIN PEOPLE P ON O.CustomerID = P.PeopleId
LEFT JOIN PEOPLE E ON O.EmployeeID = E.PeopleId
WHERE P.FirstName='April' AND P.LastName = 'Roberts';
答案 2 :(得分:0)
您的错误是您希望人们记录匹配同一订单的员工和客户,但客户当然永远不会与员工相等。
April Roberts是客户还是员工?确定然后从该客户或员工的订单表中选择数据:
select orderid, orderdate
from orders
where customerid in
(
select peopleid
from people
where firstname = 'April'
and lastname = 'Roberts'
);
无需加入order_item表。根本不需要加入。仅在您想要加入数据时加入。
我正在使用IN
,因为有两个四月罗伯茨。如果表格中存在限制,那么您可以将IN
更改为=
。
如果您真的对与四月罗伯茨有关的订单感兴趣,不知道她是员工还是客户,那么您可以使用EXISTS
代替:
select orderid, orderdate
from orders o
where exists
(
select *
from people p
where p.firstname = 'April'
and p.lastname = 'Roberts'
and p.peopleid in (o.customerid, o.employeeid)
);
您的查询中还有另一个错误:
where PEOPLE.FirstName + PEOPLE.LastName = 'April Roberts'
您在此处添加了两个值(+
用于数字添加),因此MySQL将字符串FirstName
和LastName
转换为数字。从以字母开头的字符串进行的这种转换会导致MySQL中的值为零,因此where 0 + 0 = 0
始终为真。如果你明显地认为+
会进行字符串连接(这是标准SQL中的||
运算符和MySQL中的CONCAT
函数),那么你可能已经得到where 'AprilRoberts' = 'April Roberts'
这总是错误的。