Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом / 12 сообщений из 12, страница 1 из 1
30.09.2013, 14:22:29
    #38411861
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый день,

Не очень силён в mysql и уже несколько часов бьюсь над одним запросом. Сам не осилил так что взываю к помощи...

есть таблица table1 (id,field11,field12,field13)
есть таблица table2 (id, table1_id, field21,field22,field23)
есть таблица param(id,table1_id,param_id,param_value)

table 1
1 'text11' 'text12' 'text13'
2 'text21' 'text22' 'text23'
3 'text31' 'text32' 'text33'

table 2
9 1 'text221' 'text222' 'text223'
10 2 'text321' 'text322' 'text333'
11 3 'text444' 'text555' 'text555'


table 2
1 1 1 'value1'
2 1 4 'value2'
3 3 8 'value3'
3 3 4 'value4'


Надо вывести все поля таблицы1 и таблицы 2 а также параметры к ним где param_id=4 or param_id=8



Т.е. вот такой результат нужен:

1 'text11' 'text12' 'text13' 'text221' 'text222' 'text223' 'value2' NULL
2 'text21' 'text22' 'text23' 'text321' 'text322' 'text333' NULL NULL
3 'text31' 'text32' 'text33' 'text444' 'text555' 'text555' 'value3' 'value4'
...
Рейтинг: 0 / 0
30.09.2013, 14:52:24
    #38411906
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
И что именно вызывает трудности? где ТВОИ попытки решить задачу?
...
Рейтинг: 0 / 0
30.09.2013, 15:03:40
    #38411924
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
предполагал как то так



SELECT table1.id, table1.field11,table1.field12,table1.field13, table2.id, table2.table1_id, table2.field21,table2.field22,table2.field23, (select param.param_value from param where param_id=4 and param.table1_id=table1.id) AS P1,(select param.param_value from param where param_id=8 and param.table1_id=table1.id) AS P2
FROM table1, table2
WHERE table1.id=table2.table1_id
...
Рейтинг: 0 / 0
30.09.2013, 15:08:39
    #38411936
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
ms24предполагал как то так



SELECT table1.id, table1.field11,table1.field12,table1.field13, table2.id, table2.table1_id, table2.field21,table2.field22,table2.field23, (select param.param_value from param where param_id=4 and param.table1_id=table1.id) AS P1,(select param.param_value from param where param_id=8 and param.table1_id=table1.id) AS P2
FROM table1, table2
WHERE table1.id=table2.table1_id

Хотя понимаю что без LEFT JOIN это в моей логике должно вывести только одну строку:

3 'text31' 'text32' 'text33' 'text444' 'text555' 'text555' 'value3' 'value4'

Но не выводится даже она
...
Рейтинг: 0 / 0
30.09.2013, 15:10:06
    #38411939
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Нарыл ещё способ чере GROUP_CONCAT() но это не совсем то что мне надо... Не нравиться что в результате параметры выводяться в одном поле просто через запятую.
...
Рейтинг: 0 / 0
30.09.2013, 15:25:08
    #38411954
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
ms24Нарыл ещё способ чере GROUP_CONCAT() но это не совсем то что мне надо...От него ты НИКУДА не денешься.
Структура твоей БД не гарантирует (во всяком случае не видно, где) того, что для одной и той же записи в первой таблице имеется несколько записей во второй и/или третьей таблице.

ms24предполагал как то такПодзапросы - выброси из головы. Не нужны.

ms24Хотя понимаю что без LEFT JOIN это в моей логике должно вывести только одну строку:У тебя есть исходная задача. Зачем ты вместо неё пытаешься решать совсем другую задачу? времени дофига?

ms24Надо вывести все поля таблицы1 и таблицы 2 а также параметры к ним где param_id=4 or param_id=8
Соответственно в секции FROM у тебя должны быть table1, table2 и 2 копии table3 (со своими алиасами).
...
Рейтинг: 0 / 0
30.09.2013, 15:42:54
    #38411982
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Может быть подскажете как должен выглядеть запрос ?
...
Рейтинг: 0 / 0
30.09.2013, 16:24:18
    #38412047
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Akinaв секции FROM у тебя должны быть table1, table2 и 2 копии table3 (со своими алиасами).
Напишите, пожалуйста, текст этой секции.

Код: sql
1.
2.
3.
SELECT ... -- пока оставить так
FROM ... -- вот тут написать текст
WHERE ... -- эту секцию и последующие тоже пока оставить так



PS. Используйте тег SRC - для читабельности.
...
Рейтинг: 0 / 0
30.09.2013, 18:39:12
    #38412242
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: sql
1.
2.
3.
SELECT table1.id, table1.field11,table1.field12,table1.field13, table2.id, table2.table1_id, table2.field21,table2.field22,table2.field23, (select param.param_value from param where param_id=4 and param.table1_id=table1.id) AS P1,(select param.param_value from param where param_id=8 and param.table1_id=table1.id) AS P2
FROM table1, table2, param param1, param param2
WHERE table1.id=table2.table1_id



Так ?
...
Рейтинг: 0 / 0
30.09.2013, 21:35:16
    #38412366
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Уже хорошо. Только алиасы бы покороче. Одна буква и одна цифра - достаточно. Да код почаще рвите энтерами, чтобы он растягивался по вертикали, а не по горизонтали.

Но это выполнено просто декартово произведение с отбором. Т.е. фактически внутреннее связывание первых двух таблиц, и уножение результата на две копии третьей.
Нам этого не надо. Нам надо взять ВСЕ записи первой таблицы, и соответствующие ей записи остальных. Значит, Left Join, как уже упоминалось. Причём первая таблица - слева.
Теперь об условиях связывания. Если первая и вторая связываются просто по значению соотвю. полей, то вот две коопии третьей... в одной из них надо отобрать только те записи, где param_id=4, во второй - соответственно где param_id=8. Это не считая равенства соответствующих полей.

Учитывая изложенное, модифицируйте секцию FROM.
...
Рейтинг: 0 / 0
30.09.2013, 21:50:43
    #38412369
ms24
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Идею вроде понял, буду пробовать...
Кстати, а если задача усложняется и в третьей таблице есть ещё такая запись 5 3 8 'value33' т.е. получиться что будут две разных записи с param_id=8 и надо брать то у которого id минимальный или наоборот максимальный как это сделать ?
...
Рейтинг: 0 / 0
01.10.2013, 08:47:32
    #38412547
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
ms24а если задача усложняетсяНе усложняется - это совершенно другая задача. И у неё свой решение.
Но сперва закончи с первой задачей. Там не всё так просто для начинающего.
Итак, где текст изменённой секции FROM?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]