SQL many-to-many как да избера не-joinнатите?

+1 глас
230 прегледа
попитан 2016 юли 27 от VeskoNikolov (1,620 точки)
редактиран 2016 юли 27 от VeskoNikolov

Имам следните таблици:

Users:

  • user_id
  • username
  • ...

Equipment:

  • equipment_id
  • equipment_name
  • equipment_thumb
  • ...

Equipment_own: Тази таблица е тук, за да държи кой потребител каква техника има.

  • ownership_id
  • user_id
  • equipment_id

 Въпросът ми е следният: Как да избера всички equipments, които даден user няма?

Фактически искам обратното на следното:

SELECT * 
FROM equipment_own 
JOIN equipment ON equipment.equipment_id=equipment_own.equipment_id
WHERE equipment_own.user_id = <nqkfo tam id na user>

1 отговор

0 гласа
отговорени 2016 юли 27 от VeskoNikolov (1,620 точки)

В крайна сметка реших проблема със следното: 

SELECT *
FROM `equipment`
WHERE `equipment_id` NOT IN (
    SELECT DISTINCT `equipment_id` FROM `equipment_own` WHERE `owner_id` = 13
)

коментиран 2016 юли 29 от byordanov (1,150 точки)
Моят съвет е да избягваш ползването на NOT IN. Ако потребителят има 1000 продукта, а в таблицата с продуктите имаш 100000 записа то тогава всяко едно ИД от от таблицата с продуктите ще бъде проверено измежду 1000-та продукта на потребителя.

Ако модифицираш твоят код по следния начин няма ли да ти свърши работа?
SELECT *
FROM equipment_own
JOIN equipment ON equipment.equipment_id=equipment_own.equipment_id
WHERE equipment_own.user_id != <USER_ID>

обърни внимание на " != "

Предварително се извинявам ако не съм те разбрал правилно,  още не мога да се събудя :D
коментиран 2016 юли 29 от VeskoNikolov (1,620 точки)
Всъщност правилно си ме разбрал, даже сега като го видях започвам да се чудя как не съм се сетил за това :D Благодаря!
коментиран 2016 юли 29 от byordanov (1,150 точки)
случва се, особено когато "забие" човек :)
...