major28
17.03.2014 - 22:29
Здравствуйте!
Есть нетривиальная задачка)
Есть три таблицы реализующие схему многие-ко-многим.
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
17.03.2014 - 22:35
Цитата |
задавать вопросы, почему именно ставится такая задача или почему выбрана такая архитектура бд нельзя |
я заню ответ, но я вам его не скажу... только не спрашивайте почему
_____________
Стимулятор ~yoomoney - 41001303250491
major28
17.03.2014 - 23:06
Valick я написал поскриптум ради того, чтобы предотвратить лишний флуд. Понятное дело, что первое что приходит в голову это вопрос, зачем это нужно и почему такая архитектура? Ок, скажу, бывший программист сделал именно такую архитектуру, а таблицу такую для того, чтобы выполнить мою конечную задачу.
Valick
17.03.2014 - 23:22
major28, готовый запрос будет стоить 500 рублей
_____________
Стимулятор ~yoomoney - 41001303250491
major28
17.03.2014 - 23:29
Valik ты наверно попутал этот форум с фрилансом
Valick
17.03.2014 - 23:32
major28, это ты наверно попутал этот форум с тем форумом где за тебя делают бесплатно твою работу, я пролистал твои сообщения ты за 4 года никому не помог.
___
моё дело предложить, не нравится решай сам или жди пока кто-то придумает тебе запрос
_____________
Стимулятор ~yoomoney - 41001303250491
major28
17.03.2014 - 23:38
Valick не устраивает что то так тихо пройди мимо, не выделываясь
DedMorozzz
17.03.2014 - 23:51
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
18.03.2014 - 00:03
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
18.03.2014 - 00:07
Цитата |
А так не прокатит )
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
18.03.2014 - 00:14
А вот мое решение)) спасибо всем кто откликнулся, сейчас посмотрю Ваши варианты.
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
18.03.2014 - 00:35
DedMorozzz - запрос не рабочий, выдает ошибку так как where используется до jon, после смены места все равно вывод не тот) так что она пока что нетривиальная))
zelenuy - не работает твой запрос)
Valick
18.03.2014 - 00:38
major28, запрос zelenuy работает, только выдает другой результат
Хоть и DedMorozzz не справился с задачей, но это не значит что задача сложная
У меня ушло 4 минуты, из них 35 секунд на написание самого запроса, остальное на создание таблиц
_____________
Стимулятор ~yoomoney - 41001303250491
DedMorozzz
18.03.2014 - 00:43
Цитата (major28 @ 17.03.2014 - 23:35) |
DedMorozzz - запрос не рабочий, выдает ошибку так как where используется до jon, после смены места все равно вывод не тот) так что она пока что нетривиальная)) |
я не писал копипаст. Там даже поля uid1 переименовано. И условие в конец кинь
Это форум где помощь оказывают, а не готовые решения, которые бездумно вставлять в код и надеяться что будет работать
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
major28
18.03.2014 - 00:53
DedMorozzz я все и так сразу исправил, у тебя логическая ошибка.
LEFT JOIN users1 ON users12.uid1 = users1.id
LEFT JOIN users2 ON users12.uid1 = users2.id
будут создавать только те поля что указаны в таблице связей то есть users12
Как ни крути у тебя зарос даже близко не вернет тот результат, который нужен)
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.