как создать таблицу со связью многие ко многим?

FRIE

Новичок
Автор оригинала: O1&g
Попробуй это
PHP:
SELECT country.name 
FROM country 
INNER JOIN country_birds ON country.id = country_birds.countryId
INNER JOIN birds ON birds.Id = country_birds.birdsId  
WHERE country.id = {твоя страна}
не понимаю я эти джоины (((( можете обьяснить на этом примере что сдесь происходит?
 

akd

dive now, work later
Команда форума
select country.name from country, country_birds, birds where country.id = country_birds.countryId and birds.Id = country_birds.birdsId and country.id = {твоя страна}

а так понимаешь?
 

Beavis

Banned
Автор оригинала: FRIE
не понимаю я эти джоины ((((
а, это элементарно) происходит декартово произведение трёх множеств, после чего лишние кортежи отсеиваются)
 

pilot911

Новичок
Автор оригинала: FRIE
не понимаю я эти джоины (((( можете обьяснить на этом примере что сдесь происходит?
PHP:
SELECT country.name 
FROM country 
INNER JOIN country_birds ON country.id = country_birds.countryId
INNER JOIN birds ON birds.Id = country_birds.birdsId  
WHERE country.id = {твоя страна}

происходит следующее:

мускуль ищет запись в country (FROM country ), затем ищет для этой записи подходящую по условию ( ON country.id = country_birds.countryId ) из таблицы country_birds

и так далее... и в результате выдается в строке вывод из трех таблиц :)

в общем случае, ON - это 100%й аналог WHERE, переименованный в ON для таблиц связей
 

Beavis

Banned
Автор оригинала: zerkms
неправда :-P
я бы сказал, не совсем правда, но это не принципиально)

а то что ON это то же самое что и WHERE это бред, при переносе условия из ON в WHERE результат может отличаться
 

zerkms

TDD infected
Команда форума
а то что ON это то же самое что и WHERE это бред, при переносе условия из ON в WHERE результат может отличаться
перечитай его ещё раз. он говорил о том, что семантически ON для объединения схожа с WHERE при обычной выборке из 1ой таблицы.
 

FRIE

Новичок
посидел 3 часа и допёрло наконец то !!! всё получилось! спасибо всем за помощь
особенно O1&g и pilot911
 

andrey_c

Новичок
Подскажите а как выбрать страны в которых нет определенного животного?
 

andrey_c

Новичок
Спасибо за ответы, но у меня ничего не получается, я не представляю как с помощью этих конструкций выбрать список стран для которых в таблице связи отсутствуют записи соответствующие определенному животному.
Буду очень признателен за пример.
 

pilot911

Новичок
логически рассуждай.. тебе нужно выбрать все страны, связанные с животным и не связанные с животным


в итоге у тебя получится смешанный список стран, в которых поле о животном заполнено его ID, если животное присутствует в стране, и поле со значением NULL, если животное отсутствует

тебе останется выбрать только те строчки, где ID животного равно NULL (where birds.Id=NULL)


[sql]
SELECT country.name
FROM country
LEFT JOIN country_birds ON country.id = country_birds.countryId
LEFT JOIN birds ON birds.Id = country_birds.birdsId
WHERE birds.id = NULL
[/sql]
 

Adelf

Administrator
Команда форума
SELECT country.name
FROM country
WHERE country.id NOT IN (SELECT countryId FROM country_birds)

Мне мой зпрос кажется более семантически верным, чтоли.. :)
Хотя и юзается подзапрос.

Кстати пилот, твой запрос слишком сложен.

SELECT country.name
FROM country
LEFT JOIN country_birds ON country.id = country_birds.countryId
WHERE country_birds.birdsId = NULL

Вот такой чуток попроще :)
 

pilot911

Новичок
Автор оригинала: Adelf
SELECT country.name
FROM country
WHERE country.id NOT IN (SELECT countryId FROM country_birds)

Мне мой зпрос кажется более семантически верным, чтоли.. :)
Хотя и юзается подзапрос.

Кстати пилот, твой запрос слишком сложен.

SELECT country.name
FROM country
LEFT JOIN country_birds ON country.id = country_birds.countryId
WHERE country_birds.birdsId = NULL

Вот такой чуток попроще :)
не, это ошибка - фильтровать по таблице связи, поскольку в таблице животных запись может быть скрыта, с флагом "удалено" ... соответственно, страна не покажется, в то время, как должна
 

andrey_c

Новичок
Автор оригинала: Adelf
SELECT country.name
FROM country
WHERE country.id NOT IN (SELECT countryId FROM country_birds)

Мне мой зпрос кажется более семантически верным, чтоли.. :)
Хотя и юзается подзапрос.
Это не работает, да и не должно по-моему (возвращает 0 строк)

Автор оригинала: Adelf
Кстати пилот, твой запрос слишком сложен.

SELECT country.name
FROM country
LEFT JOIN country_birds ON country.id = country_birds.countryId
WHERE country_birds.birdsId = NULL

Вот такой чуток попроще :)
Вариант с пустыми значениями, знаю но он работает со связями Один ко Многим
С помощью этого запроса можно найти страны, в которых нет ни одного животного (ну или немного переделав, животного, которого нет ни в одной стране)

Мне же нужно страны, в которых нет определенного животного (например: Медведя)
 

Adelf

Administrator
Команда форума
Мне же нужно страны, в которых нет определенного животного (например: Медведя)
Ну включи блин мозг. id медведя есть. NOT IN - вполне подойдет только пойми что это за оператор и подправь.
 
Сверху