#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
Примечание: я делаю предположение, что у вас не будет точных повторяющихся записей, если вам нужно сначала устранить дубликаты.