Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Помогите составить сложный запрос


Автор: MrImho 5.1.2010, 11:48
Здравствуйте, раньше мне хватало простых запросов, но сейчас из-за специфики задания, нельзя использовать простые запросы в связке с php.
Вот как выборка происходит на простых запросах:
Код

$get_tov=mysql_query("SELECT * FROM cat_tov WHERE catID='111'");
while($res_tov=mysql_fetch_array($get_tov))
{
$get_foto_tov=mysql_query("SELECT * FROM cat_tov_img WHERE tovID='".$res_tov[ID]."' AND vid='mini'");
$res_foto_tov=mysql_fetch_array($get_foto_tov)
$res_tov['img']=$res_foto_tov['tovID'].$res_foto_tov[name].".".$res_foto_tov[vid].".".$res_foto_tov[ext];
$content['tov_info'][]=$res_tov;
}

Нужно сделать тоже самое но за 1 запрос к mysql, что-то типа:
SELECT * FROM cat_tov INNER JOIN cat_tov_img USING(ID), но этот запрос все строки из таблицы  cat_tov_img добавляет в таблицу cat_tov, а мне надо чтобы добавилась ещё 1 колонка с именем img, вообщем смотрите выше, то что я написал работает.
Незнаю понятно ли объяснил, попробую ещё подругому:
создать колонку img и записать туда объединение значений колонок из таблицы cat_tov_img, результат будет выглядеть я думаю так:
[img]=>Array
(
[tovID]=>...
[name]=>...
[vid]=>...
[ext]=>...
)
Примечание: в таблице cat_tov колонки img нету, т.е. её нужно создать и добавить в поток и этот img должен быть в виде массива что я написал выше.
Всем спасибо за ответы.

Автор: Ипатьев 5.1.2010, 12:08
"в общем" и "не знаю" пишется раздельно.
что за такая специфика задания? 
в mysql нет типа данных "массив", и, следовательно ,вернуть она его не может

Автор: ТоляМБА 5.1.2010, 12:33
MrImho, структура таблицы1, несколько строк данных, структура таблицы2, несколько строк данных, по каким полям связывать, дополнительные условия выборки, что нужно получить в итоге. Опиши это и вероятность ответа увеличится.


Автор: MrImho 6.1.2010, 10:16
структура таблицы 1 (cat_tov) сокращённая, но этого будет достаточно:
ID | name

1  | имя 1
2  | имя 2
структура таблицы 2 (cat_tov_img) сокращённая, но этого будет достаточно:
ID | name              | ext | vid   | tovID

1  | _fghftyikyuikli  | jpg | mini |  1
2  | _fhkjtryjfihyit   | jpg | src   |  1
3  | _dthyjkshtrg   | gif   | mini |  2
4  | _dfghdghjgh   | gif   | src   |  2

Если так, как я выше написал нельзя, надо настоящие имена из таблицы 2 заменить на псевдонимы (если это возможно), ато иначе запись из таблицы 2 поле "name" заменит запись из таблицы 1 поле "name". Можно ли тогда их объединить следующим образом:
Запрос извлекает все записи из таблицы 1 и все записи из таблицы 2, где tovID (поле таблицы 2)=ID (поле таблицы 1) и vid (поле таблицы 2)=mini. Вот что хотелось бы увидеть (использую записи приведённые выше):
ID | name |  iname (псевдоним поле name 2 таблицы) | ext | vid 
1  |  имя 1 | _fghftyikyuikli                                               | jpg | mini
2  |  имя 2 | _dthyjkshtrg                                                | gif   | mini
Т.е к таблице 1 добавить несколько полей таблицы 2, а название некоторых заменить на псевдонимы (в нашем случае только 1 поле "name" на "iname").
Всем спасибо за участие.

Автор: ТоляМБА 6.1.2010, 10:34
Код
Select cat_tov.ID, cat_tov.name, cat_tov_img.name AS iname, cat_tov_img.ext, cat_tov_img.vid
From cat_tov 
Inner Join cat_tov_img
On cat_tov.ID=cat_tov_img.tovID
Where cat_tov_img.vid="mini"

Автор: Ипатьев 6.1.2010, 11:25
Весь вопрос в том, сколько картинок нам надо к каждому товару - одну или несколько...
А вся пробема - в том, что люди, приходящие задать вопрос, не умеют сформулировать решаемую задачу целиком. 
Ведь что, казалось бы, проще, чем написать человеческим языком - "нужно вывести список соваров с одной картинкой к каждому" или "нужно то-то и то-то". 
Но нет - почему-то обязательно надо писать в терминах, смысл которых автор не понимает, еще и выкидывая половину информации, "это неважно".

Автор: MrImho 6.1.2010, 19:25
ТоляМБА спасибо, помогло, но сразу другой косяк, если у товара нет картинки, он не извлекает запись о нём, мне кажется это из-за записи:
Код

Where cat_tov_img.vid="mini"

Всё правильно, все логично, только запись товара должна извлекаться, даже если картинки нет.
это условие глобально для всей записи или локально?
Можно ли как-то подругому?

Автор: ТоляМБА 6.1.2010, 19:58
Код
Select cat_tov.ID, cat_tov.name, cat_tov_img.name AS iname, cat_tov_img.ext, cat_tov_img.vid
From cat_tov 
LEFT Join cat_tov_img
On (cat_tov.ID=cat_tov_img.tovID) AND (cat_tov_img.vid="mini")


Автор: MrImho 6.1.2010, 20:10
ТоляМБА спасибо большое, Вы очень помогли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)