连接表 - AND WHERE

时间:2011-10-05 13:24:17

标签: mysql sql

我已经像这里的结果一样加入了表格: http://www.w3schools.com/sql/sql_join_left.asp

LastName    FirstName   OrderNo
Hansen      Ola         1
Hansen      Ola         2
Hansen      Ola         3
Pettersen   Kari        8
Pettersen   Kari        9
Svendson    Tove     

如何找到同时包含订单1和订单2的人员列表(LastName,FirstName)。

6 个答案:

答案 0 :(得分:3)

其他答案告诉您删除第二个WHERE

他们没有说的是,如果您要查找记录1和2,则需要使用OR,而不是AND。指定AND将失败,因为查询将查找与这两个条件匹配的单个记录,在这种情况下当然不可能。

所以你的WHERE子句应如下所示:

WHERE OrderNo = 1 OR OrderNo = 2

答案 1 :(得分:2)

删除第二个WHERE

WHERE OrderNo = 1 OR OrderNo = 2

OR

WHERE OrderNo IN (1,2)

答案 2 :(得分:1)

首先,不要两次写WHERE。每SELECT只允许一个WHERE条款。

其次,你不能有OrderNo = 1 AND OrderNo = 2行。这两个都不可能同时成立。使用OR代替AND

WHERE OrderNo = 1
OR OrderNo = 2

在这种情况下,您可以使用IN

WHERE OrderNo IN (1, 2)

答案 3 :(得分:0)

以完整的示例(带有显式table.Field以便于阅读):

Select persons.LastName, persons.FirstName, orders.OrderNo
FROM Persons
LEFT JOIN Orders order1 ON persons.P_Id=orders1.P_Id
LEFT JOIN Orders order2 ON persons.P_Id=orders2.P_Id
where (orders.OrderNo = 1 or orders.OrderNo = 2

在使用联接时非常明确这一点非常重要,这样你(和你之后的开发人员)就不会感到困惑。如果两个表都有一个具有相同名称的字段,则不提供table.Field也会抛出错误。

<强>更新

对另一个回复的评论:

  

OR有效,但没有我想要的。我需要得到OrderNo = 1和OrderNo = 2的记录.1和2值都在一起。如果我使用OR,它将返回具有这些值之一或两个

的记录

如果我正确地阅读此内容,您只是在寻找重复人物(人)的订单?如果是这种情况,那么这将解决问题:

Select DISTINCT orders1.OrderNo, persons.LastName, persons.FirstName
FROM Persons 
LEFT JOIN Orders orders1 
  ON persons.P_ID = orders1.P_ID
LEFT JOIN Orders orders2 
  ON persons.P_ID = orders2.P_ID
Where orders1.P_ID = orders2.P_ID

如果您只想要单个特定人员的订单,那么这是一个不同的查询

答案 4 :(得分:0)

WHERE OrderNo = 1
AND WHERE OrderNo = 2

您的规格非常简短。

以上AND的关系等效值可以是UNION,例如

SELECT * 
  FROM Orders
 WHERE OrderNo = 1
UNION
SELECT * 
  FROM Orders
 WHERE OrderNo = 2;

可能关系运算符是除法,即具有订单号1和2的任何人的返回名称,例如

SELECT DISTINCT LastName, FirstName
  FROM Orders AS O1
 WHERE NOT EXISTS (
                   SELECT OrderNo
                     FROM (VALUES (1), (2)) AS Divisor (OrderNo)
                   EXCEPT
                   SELECT OrderNo
                     FROM Orders AS O2
                    WHERE O2.LastName = O1.LastName
                          AND O2.FirstName = O1.FirstName
                  );

但是我怀疑你的意思是逻辑OR而不是逻辑AND(我知道一个商业分析师用自然语言中的'和'这个词写成sepcs意味着逻辑OR,例如“它可能是这个,它可能是那个”)例如

SELECT * 
  FROM Orders
 WHERE (OrderNo = 1 OR OrderNo = 2);

SQL有很好的语法糖:

SELECT * 
  FROM Orders
 WHERE OrderNo IN (1, 2);

答案 5 :(得分:0)

我假设你想要拥有订单1和2的人的名字。

您可以使用此查询:

SELECT LastName, FirstName 
FROM MyTable 
WHERE OrderNo IN (1, 2)
GROUP BY LastName, FirstName
HAVING COUNT(*) = 2

注意:我假设您没有完全重复的记录,如果您需要先删除重复记录。