Нужен совет по MySQL

Статус: Offline
Реєстрація: 02.12.2008
Повідом.: 55
Нужен совет по MySQL

Доброго всем дня, суть вопроса - из трех таблиц сделать запрос, который выдаст результат(рис 11).
Попробовал вот такой запрос:

SELECT tA.*, tB.nameB, tC.nameC
FROM tA
LEFT OUTER JOIN tB ON tA.id = tB.id
LEFT OUTER JOIN tC ON tB.id = tC.id
ORDER BY tA.id, tB.nameB, tC.nameC

...но резльтат (рис 22) не совсем тот, что нужно...

Видать где-то нужно вставить условие, чтоб ограничение по выводу строк было, по номерам (например из всех таблиц id=1 - 3 шт, id=2 - 2 шт и т.д) эти числа и будут ограничением, но...
Но это только предположение, нужен ваш совет и напутствие в решении вопроса.
 

Вкладення

  • 11.JPG
    11.JPG
    66.1 КБ · Перегляди: 102
  • 22.JPG
    22.JPG
    46.3 КБ · Перегляди: 73
бред какой-то.
это очередной шыдевр преподов из агадемии "Шаг в бездну" или за этим стоит какая-то реальная задача?
почему ббб-ууу можно, а ббб-ззз низззя?

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

Видите ли сервер БД выдает результат тот что запросили с помощью SQL запросов. И (как в этом случае) делает это правильно.

Какой вам нужно он не знает.

Не буду кривить душой, из этой серии, но не Шаг... просто самому хочется понять, как его (запрос) сделать
Так лпределись чего ты получить хочешь прежде чем его делать.

Судя по таблице результа, берет сначала первые значения из "С", потом вторые из "В" или что-то в этом роде

сначала он связывает таблицы в соответствии с условиями join а потом "берет"
 
Так лпределись чего ты получить хочешь прежде чем его делать.
На рис 11 показаны 3 таблицы и результат который нужно получить. А на 22 рисунке то, что выдает мой пробный вариант, вот и спрашиваю чего не хватает в моем запросе, чтоб результат был как на рис. 11 (result) .
 
такой результат получит нельзя (кроме как выбирать каждую ячейку отдельным запросом) - он просто из пальца высосан.
 
похоже на full outer
если б автор умел формулировать задачи, может быть у кого-то и возникло бы желание помочь.. а так ну найух))
 
В языке SQL порядок следование записей в таблице не определен, т.е. по усмотрению субд. Поскольку rowid в mysql тоже нет, нужно вводить уникальный ключ.
Имхо, одним запросом такое сделать нельзя. Нужно что-то типа select name* from tA, (select from tC, tB limit 1)
 
В языке SQL порядок следование записей в таблице не определен, т.е. по усмотрению субд. Поскольку rowid в mysql тоже нет, нужно вводить уникальный ключ.
Имхо, одним запросом такое сделать нельзя. Нужно что-то типа select name* from tA, (select from tC, tB limit 1)
Так это и есть 1 запрос, но с подзапросом :). А с ними (с подзапросами, да и корелированным) у мускула бяда (если я прааально помню).

Вобщем в реальной, живой ситуации я бы делал процедуру. Цикл по первой таблице, курсоры по двум другим.
Кстати, полез проверить умеет ли такое мускул - и вот статейка на хабре что умеет:
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
Использование ORDER BY и DISTINCT даст нужный результат, только не понятно нахуй.
 
Епрст. Этот реальная задача на реальных бизнес-данных или высосанная из непонятно откуда институтская/академическая шняга?

*В один запрос не вижу способа такое сделать
 
похоже на full outer
если б автор умел формулировать задачи, может быть у кого-то и возникло бы желание помочь.. а так ну найух))
Есть тестовое задание по мускулу, которое состоит из около 40 вопросов и ЭТОй задачи. Может и full outer, но он не работает на мускуле, скорей на постгресе.

joker сказав(ла):
умеет ли такое мускул - и вот статейка на хабре
Спс, щаз будем изучать статейку и пробовать подзапросы..

Ferox сказав(ла):
Использование ORDER BY и DISTINCT даст нужный результат
Спс буду пробовать.

MLover сказав(ла):
Епрст. Этот реальная задача или высосанная из непонятно откуда институтская/академическая шняга?
*В один запрос не вижу способа такое сделать
Это тестовое задание, судя по отзывам выше, похожа на "высососанную из...", сейчас пока пробую, то что посоветовали...
 
Останнє редагування:
Почитал, попробовал, не получилось - сделал выводы:

1) для юниора задачка не совсем из легких
2) высосанная из пальца
3) оставлю свой вариант, покажу, что пытался...надеюсь остальные ответы на тесты правильные.

Всем спасибо за уделенное внимание, не буду более отнимать время.

П.с. Надеюсь со временем, как наберусь практики, для интереса попробую к задачке вернуться :)
 
Использование ORDER BY и DISTINCT даст нужный результат, только не понятно нахуй.

:рл:

Есть тестовое задание по мускулу, которое состоит из около 40 вопросов и ЭТОй задачи. Может и full outer, но он не работает на мускуле, скорей на постгресе.

Вот автору этого тестового задания и надо дать подзатыльник. А full outer эмулируется через union left+right.
 
Чем плохая задача для собеседования? Решивший ее покажет не только владение SQL-ем, но и находчивость и умение добиваться результата :)
Как бы я сделал. Т.к. задача далека от практических нужд, то нужно не преумножать сущности и додумывать условия, а просто сделать то, что нужно и ни граммом более. Точечное решение конкретно этой задачи. Возможно? Возможно. Взять, нарезать отдельными запросами требуемые строки хоть по одной через limit, а потом объединить их union-ом. Можно сделать через full outer большую таблицу и вырезать delete все лишнее. Можно комбинировать эти два метода. Чем короче и красивее получится решение, тем больше будет получено балов.

Чуть опередили :)
Возможно для head-ddd-nul потребуется ввести вспомогательную таблицу c nameC, но без строки с id = 2, т.к. из существующих таблиц всегда будет head-ddd-www.
 
Чем плохая задача для собеседования? Решивший ее покажет не только владение SQL-ем, но и находчивость и умение добиваться результата
Владеющий SQL решать ее не станет а покрутит пальцем у виска. Самый лучший в данном случае способ продемонстрировать владение SQL.
 
Использование ORDER BY и DISTINCT даст нужный результат, только не понятно нахуй.

если хочешь казаться много более важным и умным, чем ты есть на самом деле
(а ты, несомненно, этого хочешь),
тебе лучше некоторое время просто ничего не писать.
 
Назад
Зверху Знизу