Автор Тема: склейка двух таблиц  (Прочитано 6471 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« : 27 Августа 2004, 10:00:07 »
есть запрос вида: SELECT goods.id, identifier, groups, sire, title, param, price, available, desc1, rating, limage3 FROM goods, parameters WHERE identifier = goods_identifier AND catalog_id=44 AND sire=7 AND (name_id  = 10 OR name_id  = 1)  GROUP BY goods.id ORDER BY rating LIMIT 0,10, нужен идентичный запрос но работающий при условии (name_id  = 10 AND name_id  = 1). У кого какие идеи?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
склейка двух таблиц
« Ответ #1 : 27 Августа 2004, 10:05:17 »
Цитировать
но работающий при условии (name_id = 10 AND name_id = 1). У кого какие идеи?

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

Выбрать всех детей в классе, причем так, чтобы у ребенка был возраст и 1 год, и 10 лет.
Много ты таким запросом навыбираешь?

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #2 : 27 Августа 2004, 10:08:40 »
Цитировать
RomikChef:
Выбрать всех детей в классе, причем так, чтобы у ребенка был возраст и 1 год, и 10 лет.
Много ты таким запросом навыбираешь?


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

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
склейка двух таблиц
« Ответ #3 : 27 Августа 2004, 10:12:52 »
Альтернативу ЧЕМУ? Бессмысленному выражению? Я тебе сколько угодно альтернатив накидаю.

Пойди-ка ты, поспи.
или смени род занятий.

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #4 : 27 Августа 2004, 10:32:25 »
Цитировать
RomikChef:
Альтернативу ЧЕМУ? Бессмысленному выражению? Я тебе сколько угодно альтернатив накидаю.

Пойди-ка ты, поспи.
или смени род занятий.


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

Попробую переформулировать задачу

есть три таблицы
goods – хранит информацию по товарам
parameters – хранит параметры товара для выборки по фильтру, причем соответсвие товара заданному параметру задается парой «идентификатор товара»->>id параметра. В этой базе одному товару может соответствовать сколько угодно параметров, напрмер:
структура:`parameters` ( `id` int(11) NOT NULL auto_increment,  `name_id` int(11) default NULL, `goods_identifier` text NOT NULL,   PRIMARY KEY  (`id`))
данные:
1, 10, \'A50\'
2, 9, \'A50\'
3, 7, \'A50\'
4, 1, \'A50\'
5, 1, \'A52\'
6, 7, \'A52\'
7, 9, \'A52\'
8, 10, \'A52\'
Необходимо выбрать все товары параметры которых соответствуют заданным, то есть если для данного товара в таблице «parameters» есть соответствующая запись, но при этом нужно исключить те товары, для которых такой записи нет, также необходимо исключить те товары, для которых нет хотя бы одной записи соответствующей заданному параметру.

Эту схему я к нынешнему моменту реализовал путем двух последовательных запросов в базу с сортировкой результата, но эта схема очень медленна, поэтому ищу возможность реализовать все на одном запросе. Буде крайне признателен за любую помощь или идею.


P.S. поспать это конечно хорошо, но начальство требует результат, а тот что я могу предложить меня не удовлетворяет.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
склейка двух таблиц
« Ответ #5 : 27 Августа 2004, 10:33:43 »
Цитировать
всего лишь попытка описать задачу.

она тебе, бесспорно, удалась

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #6 : 27 Августа 2004, 10:38:50 »
Цитировать
RomikChef:
она тебе, бесспорно, удалась


ты б помог лучше чем… а не ругал

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
склейка двух таблиц
« Ответ #7 : 27 Августа 2004, 15:22:10 »
ГлЮпый
напиши-ка сюда словами, что означает условие :
(name_id = 10 AND name_id = 1)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #8 : 27 Августа 2004, 15:39:06 »
Цитировать
Макс:
напиши-ка сюда словами, что означает условие :
(name_id = 10 AND name_id = 1)


один и тот же товар обладает более чем одним параметром, соответственно более чем одна запись в таблице, необходимо соблюсти условие при котором будут выбраны только те товары для которых установлены все заданные в фильтре параметрами, то есть, необходимо выбрать только те товары, для которых на каждый из заданных параметров в таблице существует запись. Параметр характеризуется числом, порядковым номером, тобиш в случае когда "name_id = 10" товар соответствует заданному параметру. Так как параметров больше одного то и получаем структуру типа "name_id = 10 AND name_id = 1", жесткое соответствие на все заданные параметры.

P.S. не знаю сможет ли кто-то разобрать этот бред, под конец я уже и сам запутался :-(.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
склейка двух таблиц
« Ответ #9 : 27 Августа 2004, 16:12:08 »
во-первых, запись name_id = 10 AND name_id = 1 - неправильная (почему, подумай сам)
Во-вторых, приведи струкутуры таблиц goods и parameters (с комментариями)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #10 : 27 Августа 2004, 16:22:42 »
Цитировать
Макс:
запись name_id = 10 AND name_id = 1 - неправильная

этоя и сам знаю. что касается структуры, таблицу parameters я уже приводил выше, вот коментарии к ней:
`parameters` ( `id` int(11) NOT NULL auto_increment, `name_id` int(11) default NULL, `goods_identifier` text NOT NULL, PRIMARY KEY (`id`))
id - думаю понятно без коментария
name_id - порядковый номер параметра
goods_identifier - идентификатор товара (его уникальный код)

касательно таблицы goods:
CREATE TABLE `goods` (
  `id` int(11) NOT NULL auto_increment,
  `identifier` varchar(50) default NULL,
  `groups` varchar(255) default NULL,
  `sire` varchar(255) default NULL,
  `title` varchar(255) default NULL,
  `param` varchar(255) default NULL,
  `desc1` text,
  `desc2` longtext,
  `catalog_id` int(11) default NULL,
  `price` double(5,2) default NULL,
  `price1` double(5,2) default NULL,
  `price2` double(5,2) default NULL,
  `price3` double(5,2) default NULL,
  `guarantee` varchar(255) default NULL,
  `available` int(11) default NULL,
  `rating` int(11) default NULL,
  `price_num` int(11) default NULL,
  `update1` int(11) default NULL,
  `fack_id` int(11) default NULL,
  `count1` int(11) default NULL,
  `limage1` varchar(255) default NULL,
  `limage2` varchar(255) default NULL,
  `limage3` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM ;

id - порядковый номер записи
identifier - идентификатор товара (его уникальный код)
groups - группа товара
sire - производитель
title - название
param - дополнительный параметр (используется как расширение названия)
desc1 - краткое описание
desc2 - расширенно описание
catalog_id - номер каталога которому ссответсвует товар
price, price1, price2, price3 - цены на товар
guarantee - гарантийный срок
available - наличие
rating - рейтинг товара
price_num - номер прайс листа
update1 - дата обнвления записи
fack_id - идентификатор отвественного за обновление
count1 - уж и непомню шо воно таке, не используется в общем
limage1, limage2, limage3 - картинки товара

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
склейка двух таблиц
« Ответ #11 : 27 Августа 2004, 16:43:18 »
Я понял, чего ГлЮпый хочет. Вывести товары, для которых присутствуют все из указанного набора параметров (1 и 10, например), да? Т.е. сопоставление 1 строки таблицы goods с несколькими из parameters.
Правда, пока сам запрос придумать не могу.

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #12 : 27 Августа 2004, 16:45:46 »
Цитировать
Forza:
Я понял, чего ГлЮпый хочет. Вывести товары, для которых присутствуют все из указанного набора параметров (1 и 10, например), да? Т.е. сопоставление 1 строки таблицы goods с несколькими из parameters.
Правда, пока сам запрос придумать не могу.

именно так :-)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
склейка двух таблиц
« Ответ #13 : 27 Августа 2004, 16:48:12 »
SELECT goods_identifier, COUNT(*) as amount FROM parameters
WHERE name_id = 10 OR name_id = 1
GROUP BY goods_identifier
HAVING amount = 2; //
получишь список  goods_identifier у которых указаны оба параметра.


Как одним запросом - не знаю, возможно сработает  такое :

SELECT
    goods.id, identifier, groups, sire, title,
    param, price, available, desc1, rating, limage3 ,
[b]    COUNT(goods_identifier) as goods_identifier_amount [/b]
FROM
    goods, parameters
WHERE
    identifier = goods_identifier AND catalog_id=44
    AND sire=7 AND (name_id = 10 OR name_id = 1)
[b]GROUP BY goods_identifier
HAVING goods_identifier_amount = 2[/b]
ORDER BY rating LIMIT 0,10

Почему в HAVING используется именно двойка , подумай сам. Она там не всегда будет.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн ГлЮпый

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://csm.com.ua
склейка двух таблиц
« Ответ #14 : 27 Августа 2004, 17:03:05 »
Цитировать
Макс:
SELECT goods_identifier, COUNT(*) as amount FROM parameters
WHERE name_id = 10 OR name_id = 1
GROUP BY goods_identifier
HAVING amount = 2;

точто доктор прописал :-), Макс с меня пиво как буду в Кременчуге, аль как ты в Киеве объявишся...

еще один вопрос, если я правильно понял синтаксис второго примера то для, положим трех параметров, он будет таким:
SELECT goods.id, identifier, groups, sire, title, param, price, available, desc1, rating, limage3, COUNT( goods_identifier ) AS goods_identifier_amount
FROM goods, parameters
WHERE identifier = goods_identifier AND catalog_id =44 AND sire =7 AND (
name_id =9 OR name_id =1 OR name_id =7
)
GROUP BY goods_identifier
HAVING goods_identifier_amount =3
ORDER BY rating
LIMIT 0 , 10
но в этом случае что-то не срабатывает, он выдает только один ответ, хотя должен два, первыйже пример срабатвает правильно при любом количестве параметров, в чем я ошибся?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28