mysql подзапросы повторяются - PullRequest
0 голосов
/ 12 марта 2020

Добрый день Всем, у меня возникают трудности с выполнением этого запроса, когда мне нужно было указать имя лодки, номер владельца, фамилию владельца и имя владельца для каждой лодки в Марина 1.

У меня есть таблица marina_slip marina_slip и marina_owner marina_owner

У меня есть код

SELECT ms.boat_name, ms.owner_num, o.last_name, o.first_name
FROM marina_slip ms, owner o
WHERE o.owner_num IN(SELECT ms.owner_num FROM marina_slip ms WHERE marina_num = '1');

вывод правильный, но это повторяется

query_output

query_output

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Вы делаете соединение в старом стиле, но без условий соединения. Используйте правильное объединение с предложением ON:

SELECT ms.boat_name, ms.owner_num, o.last_name, o.first_name
FROM marina_slip ms INNER JOIN owner o
ON o.owner_num = ms.owner_num
WHERE o.owner_num IN (SELECT ms.owner_num FROM marina_slip ms WHERE marina_num = '1'); 

или:

SELECT ms.boat_name, ms.owner_num, o.last_name, o.first_name
FROM marina_slip ms INNER JOIN owner o
ON o.owner_num = ms.owner_num
WHERE ms.marina_num = '1'; 
0 голосов
/ 12 марта 2020

У вас нет стыков между вашими столами.

Вы можете сделать это с помощью LEFT JOIN

SELECT * FROM marina_slip
LEFT JOIN owner ON owner.owner_num=marina_slip.owner_num
WHERE marina_num=1

Или, если вы хотите использовать свой выбор, добавьте ms.owner_num=o.owner_num в ваше предложение WHERE.

SELECT *
FROM marina_slip ms, owner o
WHERE ms.owner_num=o.owner_num
    AND o.owner_num IN(SELECT ms.owner_num FROM marina_slip ms WHERE marina_num = '1');

Демоверсия dbfiddle

0 голосов
/ 12 марта 2020

Мы не выполняли подобные объединения вот уже 30 лет:

FROM marina_slip ms, owner o

В основном потому, что это стимулирует проблему, которую вы видите сейчас; каждая строка из marina_slip объединяется с каждой строкой от владельца. Между указанными здесь таблицами нет отношения . Используйте современный синтаксис объединения, и у вас не возникнет проблем:

SELECT ms.boat_name, ms.owner_num, o.last_name, o.first_name
FROM 
  marina_slip ms

  --express the relationship between the tables. -> owner num in each table is equal 
  INNER JOIN owner o ON o.owner_num = ms.owner_num

WHERE ms.marina_num = '1'; 

Пожалуйста, см. Этот другой вопрос или Блог Джеффа Этвуда по кодированию для получения дополнительной информации о том, как использовать синтаксис INNER / LEFT / RIGHT JOIN

...