Объединенные таблицы — И ГДЕ

#mysql #sql

#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.

Комментарии:

1. Не используйте w3schools, это не очень хороший ресурс, см.: w3fools.com

Ответ №1:

В других ответах говорилось, что вам нужно удалить второй WHERE .

Чего они не сказали, так это того, что если вы ищете обе записи 1 и 2, вам нужно будет использовать an OR , а не an AND . Указание AND приведет к сбою, поскольку запрос будет искать единственную запись, соответствующую обоим критериям, что, конечно, невозможно в данном случае.

Итак, ваше WHERE предложение должно выглядеть следующим образом:

 WHERE OrderNo = 1 OR OrderNo = 2
  

Комментарии:

1. ИЛИ работает, но не так, как хотелось бы. Мне нужно получить запись, которая имеет OrderNo = 1 И OrderNo = 2. Оба значения 1 и 2 вместе. Если я использую OR, он вернет мне записи, которые имеют одно из этих значений или два.

2. @user955399, если вы хотите что-то очень конкретное, пожалуйста, отредактируйте вопрос, чтобы указать точный результат, который вы хотите. (желательно в виде таблицы, как table1 в вашем вопросе)

3. @user955399 — согласен; вопрос действительно не был ясен, что это то, чего вы хотели. Чтобы достичь этого в одном запросе, вам нужно будет полностью изменить способ соединения таблиц. На данный момент у вас нет ни одной записи с OrderNo=1 и = 2; у вас есть две записи. Можно будет переписать запрос, чтобы поместить оба порядковых номера в одну и ту же запись, но, вероятно, это не самый разумный способ что-то делать. Гораздо проще просто собрать две совпадающие записи и отобразить / обработать их вне SQL в соответствии с вашими потребностями.

Ответ №2:

Удалите второй, ГДЕ

 WHERE OrderNo = 1 OR OrderNo = 2
  

или

 WHERE OrderNo IN (1,2)
  

Комментарии:

1. хорошо. Я удалил свой -1. 🙂 (что меня поражает, так это то, что все три отдельных ответа допускали одну и ту же ошибку! теперь все они исправлены, но, должно быть, произошла какая-то коллективная слепота)

Ответ №3:

Во-первых, не пишите WHERE дважды. Вам разрешено только одно WHERE предложение на SELECT .

Во-вторых, у вас не может быть строки where OrderNo = 1 AND OrderNo = 2 . Невозможно, чтобы оба они были истинными одновременно. Используйте OR вместо AND :

 WHERE OrderNo = 1
OR OrderNo = 2
  

В этом случае вы могли бы просто использовать В:

 WHERE OrderNo IN (1, 2)
  

Ответ №4:

 WHERE OrderNo = 1
AND WHERE OrderNo = 2
  

Ваша спецификация очень краткая.

Реляционный эквивалент И выше может быть UNION , например

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

Возможно, реляционным оператором является divide, т.е. Возвращает имя любого пользователя с порядковыми номерами 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
                  );
  

Но я скорее подозреваю, что вы имели в виду логическое ИЛИ, а не логическое И (я знал бизнес-аналитика, который писал seppc со словом «и» на естественном языке для обозначения логического ИЛИ, например, «Это может быть это, и это может быть то»), например

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

В SQL для этого есть хороший синтаксический сахар:

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

Ответ №5:

Взяв полный пример (с явной таблицей.Поле для удобства чтения):

 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
  

Важно быть очень четким при работе с объединениями, чтобы вы (и разработчики после вас) не запутались. Не предоставление таблицы.Поле также выдаст ошибку и ошибку, если в двух таблицах есть поле с одинаковым именем.

Обновить

Из комментария к другому ответу:

ИЛИ работает, но не так, как хотелось бы. Мне нужно получить запись, которая имеет OrderNo = 1 И OrderNo = 2. Оба значения 1 и 2 вместе. Если я использую OR, он вернет мне записи, которые имеют одно из этих значений или два

Если я правильно это читаю, вы ищете только заказы, которые отправляются повторным пользователям (Person)? Если это так, то это поможет:

 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
  

Если вам нужны заказы только для одного конкретного человека, это совсем другой запрос

Ответ №6:

Я предполагаю, что вам нужны имена людей, у которых есть оба заказа 1 и 2.

Вы могли бы использовать этот запрос:

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

Примечание: я делаю предположение, что у вас не будет точных повторяющихся записей, если вам нужно сначала устранить дубликаты.