[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Непростая выборка много-ко-многим
Страницы: 1, 2
major28
Здравствуйте!
Есть нетривиальная задачка)
Есть три таблицы реализующие схему многие-ко-многим.

users1
id | name
1 | Vasya
2 | Petya

users2
id | name
1 | Ksusha
2 | Oksana

users12
u1id | u2id | type(любое значение не важно)
1 | 1 | 10
2 | 1 | 15


Нужно вытащить все возможные пересечения между полями таблиц users1 и users2, и если вдруг это пересечение есть в таблице связей users12 вывести подробную информацию об этом пересечении (то есть поле type таблицы связей)

То есть на выходе получиться должно
users1.name | users2.name | u1id | u2id | type
Vasya | Ksusha | 1 | 1 | 10
Vasya | Oksana | 1 | 2 | NULL
Petya | Ksusha | 2 | 1 | 15
Petya | Oksana | 2 | 2 | NULL

p.s. задавать вопросы, почему именно ставится такая задача или почему выбрана такая архитектура бд нельзя) Просто есть задача и ее надо сделать) согласитесь, она нетривиальная)
Valick
Цитата
задавать вопросы, почему именно ставится такая задача или почему выбрана такая архитектура бд нельзя

я заню ответ, но я вам его не скажу... только не спрашивайте почему



_____________
Стимулятор ~yoomoney - 41001303250491
major28
Valick я написал поскриптум ради того, чтобы предотвратить лишний флуд. Понятное дело, что первое что приходит в голову это вопрос, зачем это нужно и почему такая архитектура? Ок, скажу, бывший программист сделал именно такую архитектуру, а таблицу такую для того, чтобы выполнить мою конечную задачу.
Valick
major28, готовый запрос будет стоить 500 рублей


_____________
Стимулятор ~yoomoney - 41001303250491
major28
Valik ты наверно попутал этот форум с фрилансом
Valick
major28, это ты наверно попутал этот форум с тем форумом где за тебя делают бесплатно твою работу, я пролистал твои сообщения ты за 4 года никому не помог.
___
моё дело предложить, не нравится решай сам или жди пока кто-то придумает тебе запрос

_____________
Стимулятор ~yoomoney - 41001303250491
major28
Valick не устраивает что то так тихо пройди мимо, не выделываясь
DedMorozzz
SELECT * FROM users12 WHERE users12.uid1 != users12.uid2
LEFT JOIN users1 ON users12.uid1 = users1.id
LEFT JOIN users2 ON users12.uid1 = users2.id


Если нужны какие-то определённые поля - вместо * перечисли их с алиасом
т.е. SELECT users1.name as name ...

Цитата (major28 @ 17.03.2014 - 21:29)
согласитесь, она нетривиальная)

К сожалению не соглашусь, задача типовая

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
zelenuy
major28
А так не прокатит )
SELECT users1.name, users2.name, users12.u1id, users12.u2id, users12.type 
FROM
`users1`, `users2`, `users12`
WHERE users1.id = users2.id AND users1.id = users12.u1id
Valick
Цитата
А так не прокатит )

SELECT users1.name, users2.name, users12.u1id, users12.u2id, users12.type
FROM `users1`, `users2`, `users12`

zelenuy, наверно не прокатит

name name id1 id2 type
Vasya Ksusha 1 1 10
Petya Ksusha 1 1 10
Vasya Oksana 1 1 10
Petya Oksana 1 1 10
Vasya Ksusha 2 1 15
Petya Ksusha 2 1 15
Vasya Oksana 2 1 15
Petya Oksana 2 1 15

_____________
Стимулятор ~yoomoney - 41001303250491
major28
А вот мое решение)) спасибо всем кто откликнулся, сейчас посмотрю Ваши варианты.

SELECT u1.name as name1, u2.name as name2, u1.id as u1id, u2.id as u2id, u12.type as type
FROM
`users1` u1
left join `users2` u2 ON u1.id!=u2.id or u1.id=u2.id
left join users12 u12 ON u12.u1id=u1.id and u12.u2id=u2.id
major28
DedMorozzz - запрос не рабочий, выдает ошибку так как where используется до jon, после смены места все равно вывод не тот) так что она пока что нетривиальная))

zelenuy - не работает твой запрос)
Valick
major28, запрос zelenuy работает, только выдает другой результат
Хоть и DedMorozzz не справился с задачей, но это не значит что задача сложная
У меня ушло 4 минуты, из них 35 секунд на написание самого запроса, остальное на создание таблиц

_____________
Стимулятор ~yoomoney - 41001303250491
DedMorozzz
Цитата (major28 @ 17.03.2014 - 23:35)
DedMorozzz - запрос не рабочий, выдает ошибку так как where используется до jon, после смены места все равно вывод не тот) так что она пока что нетривиальная))

я не писал копипаст. Там даже поля uid1 переименовано. И условие в конец кинь
Это форум где помощь оказывают, а не готовые решения, которые бездумно вставлять в код и надеяться что будет работать

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
major28
DedMorozzz я все и так сразу исправил, у тебя логическая ошибка.
LEFT JOIN users1 ON users12.uid1 = users1.id
LEFT JOIN users2 ON users12.uid1 = users2.id
будут создавать только те поля что указаны в таблице связей то есть users12
Как ни крути у тебя зарос даже близко не вернет тот результат, который нужен)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.