SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.12.2008 00:51:01

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Помогите модифицировать запрос, пож

Такой вот запрос (из PHP):


INSERT INTO $table_image_lang (id_image, id_lang, legend)
SELECT id_image, 3 AS id_lang, 'STROKA' AS legend FROM $table_image_lang


Нужно, чтобы вместо 'STROKA' был включен текст из поля name другой таблицы $table_product_lang, причем где name берется из строки, где id_lang = 3

СПАСИБО

Неактивен

 

#2 21.12.2008 01:39:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Помогите модифицировать запрос, пож

INSERT INTO $table_image_lang (id_image, id_lang, legend)
SELECT i.id_image, p.id_lang, p.name AS legend FROM $table_image_lang i, $table_product_lang p WHERE p.id_lang=3

Неактивен

 

#3 21.12.2008 04:43:56

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Re: Помогите модифицировать запрос, пож

Урра! Работает!

Да только я, видать, неверно сформулировал задачу, ВЕРНЕЕ, НЕДОФОРМУЛИРОВАЛ:


дело в том, что так name проставляется ОДИНАКОВЫЙ ДЛЯ ВСЕХ записей, которые инсертятся В ТАБЛИЦУ $table_image_lang, где стоит 3 в поле id_lang (как и было сформулировано)

а нужно, чтобы проставлялось ТОЛЬКО У ТЕХ, у которых СОВПАДАЮТ ЕЩЕ И id_product!
Только вот поле id_product присутствует в таблицах $table_image и $table_product, но не присутствует в $table_image_lang


перекурил кучу информации про синтаксис... В общем, дым в тумане под утро... Голова не работает совсем.

Отредактированно Jo! (21.12.2008 04:52:41)

Неактивен

 

#4 21.12.2008 06:10:32

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Re: Помогите модифицировать запрос, пож

В общем, через ПХП это реализовал так (с тем, что найдется добрый переводчик на SQL):


$query="SELECT id_product, name from $table_product_lang WHERE id_lang = 3";
$result = mysql_query($query);
while($r=mysql_fetch_array($result)) {
echo "$r[0] - $r[1]<br/>"; //эхо для удобства. $r[0] это id_product, $r[1] это name


$query1="SELECT id_image FROM $table_image WHERE id_product = $r[0]";
$result1 = mysql_query($query1);
while($r1=mysql_fetch_array($result1)) {echo "$r1[0]<br/>"; //эхо для удобства. $r1[0] это id_image


$query2="UPDATE $table_image_lang SET legend='$r[1]' WHERE id_image = $r1[0] AND id_lang = 3";
$result2 = mysql_query($query2);


} //end while
} //end while1

 


Только я уверен, что можно все одним запросом на MySQL сделать. А то криво это все как-то... Цикл в цикле, понимаешь... Да и непонятно, как это все отреагирует при совпадениях там итд... Туману стало больше, одним словом.
Может кто переведет? wink

Отредактированно Jo! (21.12.2008 06:13:34)

Неактивен

 

#5 21.12.2008 09:29:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Помогите модифицировать запрос, пож

UPDATE $table_image_lang il SET legend = (SELECT p.name FROM $table_product_lang p, $table_image i WHERE p.id_product=i.id_product AND p.id_lang=3) WHERE il.id_image=i.id_image;


Чтобы сразу правильно добавлял:
INSERT INTO $table_image_lang (id_image, id_lang, legend)
SELECT i.id_image, p.id_lang, p.name AS legend FROM $table_image i, $table_product_lang p WHERE p.id_lang=3 AND p.id_product=i.id_product;

Насколько я понимаю, здесь правильней использовать FROM $table_image, а не $table_image_lang как написано в первом посте.

Неактивен

 

#6 21.12.2008 10:01:50

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Re: Помогите модифицировать запрос, пож

После бессонной ночи что from, что не from - все сливается...
Одно знаю - INSERT вариант работает! (на первый и на второй не очень свежие взгляды)
UPDATE не хочет - ошибка такая: ERROR 1109 Unknown table 'i' in where clause


Вот поля таблиц

$table_image_lang:
id_image,  id_lang,  legend

$table_image:
id_image,  id_product,  position,  cover

$table_product_lang:
id_product,  id_lang,  ....  name, .... (итд)


По мне - какой может быть FROM $table_image, если в $table_image нету поля legend... Или это я глючу уже?

Отредактированно Jo! (21.12.2008 10:26:14)

Неактивен

 

#7 22.12.2008 15:52:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите модифицировать запрос, пож

Jo! написал:

UPDATE не хочет - ошибка такая: ERROR 1109 Unknown table 'i' in where clause

Ошибка звучит как "таблицы i" нету. Применительно к Вашему контексту - не определена переменная
$table_image при вызове UPDATE (соответственно, подставляется пустое значение и алиас i MySQL
расценивает как название таблицы).

Неактивен

 

#8 25.12.2008 13:56:29

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Re: Помогите модифицировать запрос, пож

Да я-то понимаю, "как это звучит". Не понимаю, почему...

Именно таблицы под именем "i" нету. Но это псевдоним, как я понял...
А остальные таблицы все есть. И переменные все определены.

Отредактированно Jo! (25.12.2008 13:58:10)

Неактивен

 

#9 25.12.2008 14:10:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите модифицировать запрос, пож

Таки прочитайте до конца то, что я написал. Дело не в i, дело в переменной $table_image.

Неактивен

 

#10 26.12.2008 19:19:33

Jo!
Участник
Зарегистрирован: 21.12.2008
Сообщений: 6

Re: Помогите модифицировать запрос, пож

Так я и говорю, что с $table_image ВСЕ В ПОРЯДКЕ. Переменная определена, таблица существует, доступ к ней есть.

Неактивен

 

#11 26.12.2008 20:22:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите модифицировать запрос, пож

Брр, перечитал весь поток, что-то мы не то обсуждаем, похоже smile

1. Следующий UPDATE - подозреваю, то, что Вам нужно.

UPDATE $table_image_lang til, $table_image ti, $table_product_lang tpl
SET til.legend = tpl.name
WHERE tpl.id_lang = 3 AND ti.id_product = tpl.id_product AND til.id_image = ti.id_image AND til.id_lang=3


2. У Вас есть некоторый overkill с id_lang (по своей сути он у Вас уникален для таблички ti, однако,
Вы его используете в двух других табличках).

3. Использовать выражения типа $r1[0] - это обеспечить провал проекту. Заранее. Используйте
осмысленные выражения типа $ti_row["id_product"] (вместе с mysql_fetch_assoc).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson