мускуль - как бы хитрее извернуться?

malls
На сайте с 08.08.2005
Offline
255
740

задача такая, есть таблицы:

::дети

child.id, child.name, child.class_id

::родители
parent.id, parent.name, parent.type
(последнее поле подразумевает папа/мама)

::классы
class.id, class.name

::связи
relation.parent_id, relation.child_id

мне бы надо выбрать:

child.id, child.name, class.name, parent.name, parent.type

это просто - пока не понимаешь, что у ребенка есть и папа и мама...

при простой выборке в нее попадает либо один, либо другой - в зависимости от того какой последний был, а мне бы как то ухитриться обоих туда включить и лишние запросы не плодить при этом, в духе:

child.id, child.name, class.name, parent.name AS papa_name, parent.name AS mama_name

будут идеи?

Dreammaker
На сайте с 20.04.2006
Offline
569
#1

в одну строчку не знаю, но можно попробовать сделать что-то типа GROUP BY parent.type

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

malls
На сайте с 08.08.2005
Offline
255
#2
Dreammaker:
в одну строчку не знаю, но можно попробовать сделать что-то типа GROUP BY parent.type

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

Совершенно верно - в выборке получается два одинаковых ребенка, с разными соответственно родителями - так не подходит...

Кстати еще вопрос - можно как-нибудь переписывать имена полей по принципу:

SELECT table.* AS preffix_*

т.е. в указанном варианте не работате конечно, но принцип понятен. Идея в том чтобы все перепись была вида:

table.id AS preffix_id

table.field1 AS preffix_field1

...

iamliss
На сайте с 23.12.2006
Offline
96
#3

left join вестимо

Примерно: выбрать детей left join папа left join мама

Поля можно именовать как хош - тоже не проблема

за мир во всём мире
malls
На сайте с 08.08.2005
Offline
255
#4
iamliss:
left join вестимо
Примерно: выбрать детей left join папа left join мама
Поля можно именовать как хош - тоже не проблема

Сам примерно так же думаю - но вопрос как лучше делать вместо папа/мама? Подставлять туда оригинальную таблицу и делать ON type=... или же подставлять вложенный запрос?

Кроме того две сложности:

1. Таблицы связанны через промежуточную таблицу

2. Как поля переименовать?

По сути мне вот так нужно получить:

[ATTACH]30157[/ATTACH]

gif table.gif
iamliss
На сайте с 23.12.2006
Offline
96
#5

Это сходу. может где чё упустил, но принцип такой.

SELECT

`child`.`id`, `child`.`name`, `class`.`name` as `cname`, `papa`.`name` as `papasha`, `mama`.`name` as `mamasha`

FROM

`children_table` as `child`,

`klass_table` as `class`

LEFT JOIN

`parents_table` as `papa`

ON

`child`.`parent_id` = `papa`.`child_id`

AND

`papa`.`type` = 'ПАПА'

LEFT JOIN

`parents_table` as `mama`

ON

`child`.`parent_id` = `mama`.`child_id`

AND

`mama`.`type` = 'МАМА'

WHERE

`child`.`class_id` = `class`.`id`

Правда если есть ВСЕГДА папа и мама, то можно обычным запросом без left join

ПЗ
На сайте с 10.10.2006
Offline
92
#6

а для чего нужна таблица

::связи
relation.parent_id, relation.child_id

?

почему бы просто не использовать поля papa_id и mama_id в таблице ::дети?

Автомобили в России (http://www.autobb.ru/). Спецтехника BIZ - вся строительная, дорожная, коммунальная техника (http://www.spectehnika.biz/) и другая спецтехника в одном месте.
malls
На сайте с 08.08.2005
Offline
255
#7
Павел Зотов:
а для чего нужна таблица почему бы просто не использовать поля papa_id и mama_id в таблице ::дети?

а вдруг возникнут еще дедушка и бабушка?

iamliss:
Это сходу. может где чё упустил, но принцип такой.
Правда если есть ВСЕГДА папа и мама, то можно обычным запросом без left join

Угу - в корень зрите! Не всегда есть! :)

Упустили момент - что в таком варианте много мусора вылезает. В принципе решил так:

SELECT ... LEFT JOIN (SELECT [папы, связи]) LEFT JOIN (SELECT [мамы, связи]) LEFT JOIN [классы]

видимо вариант окончательный... т.к. меньшее количество уже трудно представить.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий