[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите не могу объединить два запроса на БД
GET
Парни подскажите кто сталкивался.

2 таблицы БД:

В 1 идет создание 3 столбцов:(id_kats - первичный автоключ, id_kat - вторичный для этой таблицы и первичный для следующей, и значение поля)
CREATE TABLE `kategoriya` (
`id_kats` int(5) NOT NULL auto_increment,
`id_kat` int(5) NOT NULL,
`tovar` varchar(255) NOT NULL,
PRIMARY KEY (`id_kats`)
)
ENGINE=MyISAM AUTO_INCREMENT=443 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=443 ;

user posted image[/IMG]

Во второй идет создание категорий (id_kat - первичный и соответствующая ему категория)

CREATE TABLE `kategoriya_id` (
`id_kat` int(4) NOT NULL auto_increment,
`kategorii` varchar(255) default NULL,
PRIMARY KEY (`id_kat`)
)
ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=35 ;

user posted image[/IMG]

Задача такая, надо чтоб на экране появлялось следющее:

Кваритры
1-комнатные
2-комнатные
...
5-комнатные и больше


Дома, дачи, участки
Дома
Дачи
Участки

Т.е. чтобы скрипт перед тем как выводить список товаров определял по ключу
id_kat категорию товара и выводил ее - причем один раз для категории

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

include("blocks/bd.php");

$zapros_2_1="1";

$a=mysql_query ("SELECT * FROM kategoriya ", $bd)or die ("Ошибка!!!".mysql_error());
$a_i = mysql_fetch_array ($a);

do {

$zapros_1=$a_i['id_kats'];//Номер товара Ауди, Тойота, Склад, диван: 1,2,3,4,...442
$zapros_2=$a_i['id_kat'];//Номер категории товра: 1,1...34
$zapros_3=$a_i['tovar'];//Товар: Ауди, Тойота, Склад, диван,....кошка

if ($zapros_2=$zapros_2_1) {$zapros_2_1=$zapros_2;} else {$zapros_2_1=$zapros_2;}

$b=mysql_query ("SELECT kategorii FROM kategoriya_id WHERE 'id_kat'=4", $bd)or die ("Ошибка!!!".mysql_error());
$b_i = mysql_fetch_array ($b);

do {$zapros_4=$b_i['kategorii'];//Категория: Квартиры, иностранные авто, женская одежда
print "Товар:".$zapros_3."<br>";
print "Категория:".$zapros_4."<br>";
} while ($b_i = mysql_fetch_array ($b));}
while ($a_i = mysql_fetch_array ($a));





Спустя 20 минут, 17 секунд (28.06.2010 - 12:30) antonov_sa написал(а):
JOIN погугли, да и на форуме тем полно, выбирай данные сразу из двух таблиц, и эту http://phpforum.ru/index.php?showtopic=21916 тему почитай

Спустя 1 час, 4 минуты, 29 секунд (28.06.2010 - 13:35) tomash написал(а):
$res=mysql_query ("SELECT kategorii, k.* FROM kategoriya_id AS ki, kategoriya AS k WHERE ki.id_kat = k.id_kat AND id_kat = 4", $bd)or die ("Ошибка!!!".mysql_error());
while($row=mysql_fetch_assoc ($res))
{
$kat[$row['kategorii']][] = $row['tovar'];
}

foreach ($kat AS $key=>$var)
{
print "Категория:".$key."<br>";
foreach ($var AS $tovar)
{
print "Товар:".$tovar."<br>";
}
}


Спустя 40 секунд (28.06.2010 - 13:35) sergeiss написал(а):
A.B.C.

И еще.

Для начала вот эту конструкцию
$b_i = mysql_fetch_array ($b);

do
{....
} while ($b_i = mysql_fetch_array ($b));


ЗАБУДЬ, КАК СТРАШНЫЙ СОН!!!

Сходи вот в эту тему http://phpforum.ru/index.php?showtopic=21916, почитай, как с БД правильно работать.

Сначала разберись с основами, а потом уже можно будет говорить о построении запроса.

Спустя 47 минут, 15 секунд (28.06.2010 - 14:23) ABC написал(а):
Спасибо....разбираюсь как-бы...

Спустя 25 минут, 2 секунды (28.06.2010 - 14:48) ABC написал(а):
tomash


$res=mysql_query ("SELECT kategorii, k.* FROM kategoriya_id AS ki, kategoriya AS k WHERE ki.id_kat = k.id_kat AND id_kat = 4", $bd)or die ("Ошибка!!!".mysql_error());


Это фантастическая строчка.О псевдонимах полей я даже не знал.

Вообще выдает ошибку:
Ошибка!!!Column 'id_kat' in where clause is ambiguous

Гугл говорит, что:

Если обратимся к полю id без префикса с именем таблицы h, получим сообщение об ошибке
#1052 - Column: 'id' in where clause is ambiguous

Необходимо явно указать, id из какой таблицы имеется ввиду. Попытка обратиться к полю по псевдониму также приведет к ошибке.


Вроде все указано верно.

не могли бы вы разъяснить чуть понятливее.


И sergeiss спасибоо про MYSQL_FETCH_ASSOC() действительно у меня везде Do While стоит...

Спустя 4 минуты, 17 секунд (28.06.2010 - 14:52) tomash написал(а):
Сделайте первичный ключ id_kat, а внешние ключи переимунйте в kat_id и все! И в дальнейшем придерживайтесь такой логики и никогда не запутаетесь)))

Спустя 3 минуты, 50 секунд (28.06.2010 - 14:56) tomash написал(а):
id_kat = 4 исправьте на k.id_kat = 4!
Я не досмотрел) Но предыдущий пост актуален)

Спустя 8 минут, 20 секунд (28.06.2010 - 15:04) ABC написал(а):
Спасибо...

Спустя 30 минут, 49 секунд (28.06.2010 - 15:35) ABC написал(а):
Tomash, не могу все равно понять, как работает твой скрипт? Нельзя ли обойтись без префиксов? ... почему MySQL запрос нельзя сделать сразу 2 т.е.

Вытащил строку из таблицы 1 посмотрел в ней значение столбика, вытащил соответствующее значение из таблицы 2 и вывел все на экран. По логике должно работать...

10 страниц прочитал форума нет похожего, может посоветуешь где почитать про преемы работы с БД, как бы типа вот такой двойной выборки, случай по моему классический....

Спустя 15 минут, 26 секунд (28.06.2010 - 15:50) SlavaFr написал(а):
без алиасов (префиксов) не обойтись
(kategorii, k.*) tomash имел в виду что ты на этом месте должен все нужные поля выводить (с префиксом) .
в принципе тебе был предложен в месте (ki.id_kat = k.id_kat) обычный INNER JOIN, так что почитай по этому поводу литературу

Спустя 2 минуты, 17 секунд (28.06.2010 - 15:53) ABC написал(а):
ок




Спустя 5 минут, 17 секунд (28.06.2010 - 15:58) tomash написал(а):
A.B.C.
Все просто! Сначала мы объявили что "kategoriya_id" у нас будет "ki", а "kategoriya" будет называтся "k", что бы не писать постоянно все название таблицы. А префиксы перед названием полей, для того что бы база не путалась, если поля называются одинаково!
Если в двух таблицах нет совпадений в названии полей, то можно обойтись без префиксов.


Цитата
почему MySQL запрос нельзя сделать сразу 2 т.е.
можно, но зачем? вызывать два раза функцию! Гонять между серверами промежуточные результаты!

Спустя 55 минут, 28 секунд (28.06.2010 - 16:53) ABC написал(а):
ок, спасибо еще раз я вроде разобрался smile.gif


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.