|
|
|
| Здравствуйте. У меня есть запрос:
SELECT
mt_partgroups.group_id as group_id,
mt_partgroups.group_name as group_name,
mt_partgroups.group_parent as group_parent,
count(mt_partsdeclaration.id) AS count
FROM mt_partgroups, mt_partsdeclaration
WHERE
mt_partsdeclaration.model_id = '0' AND
mt_partsdeclaration.part_group LIKE ('%|no') AND
mt_partsdeclaration.status = '0'
GROUP BY group_name
Нужно вместо условия "mt_partsdeclaration.part_group LIKE ('%|no')" сделать
"mt_partsdeclaration.part_group LIKE ('mt_partgroups.group_id|%')". Естественно, в таком виде это не работает, как правильно написать, не знаю, прошу помощи. Думаю, понятно, что требуется. | |
|
|
|
|
|
|
|
для: Zdraff
(09.04.2010 в 23:58)
| | Вопрос сложный или криво поставленный? :) | |
|
|
|
|
|
|
|
для: Zdraff
(09.04.2010 в 23:58)
| | схема кривая.
в прямой схеме не будет поля part_group | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 03:37)
| | Что плохого в том, что каждой запчасти присвоена группа (например, "Компоненты двигателя")? | |
|
|
|
|
|
|
|
для: Zdraff
(12.04.2010 в 09:55)
| | так.
Вы бы привели структуры таблиц, а то как-то непонятно, кому и что присвоено.
Я вижу, что в поле part_group у Вас некий композитный материал живет, и индеком для него не воспользоваться.
Еще я вижу, что у Вас полное декартово произведение (табличная операция запятая - JOIN без ON), чтоо тоже восторга не добавляет.
Собственно её Вы и пытаетесь ограничить этим LIKE. | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 10:08)
| | В запросе участвуют две таблицы, mt_partsdeclaration и mt_partgroups, первая содержит в себе информацию об объявлениях о продаже запчастей, а вторая содержит группы и подгруппы запчастей (поля: group_id, group_name, group_parent). Поле mt_partsdeclaration.part_group содержит информацию вида "группа|подгруппа", т.е. id-шники групп и подгрупп (знаю, что можно было ограничиться хранением только подгруппы, но возникали проблемы с редактированием объявлений). В том случае, если подгруппа не выбрана или группа не содержит подгрупп, в поле хранится информация "группа|no". Собственно, все эти напряги для того, чтобы сделать страничку, где будут показываться ссылки на группы и подгруппы запчастей, рядом с которыми будет в скобочках указано кол-во объявлений в каждой группе/подгруппе. | |
|
|
|
|
|
|
|
для: Zdraff
(12.04.2010 в 10:49)
| | >Поле mt_partsdeclaration.part_group содержит информацию вида "группа|подгруппа", т.е. id-шники групп и подгрупп (знаю, что можно было ограничиться хранением только подгруппы, но возникали проблемы с редактированием объявлений)
Подгруппа определяет однозначно группу?
В таком разе не можно было бы, а нужно было (сделать чужой чистый ключ на подгруппу) безо всяких если.
В самом крайнем случае Вы бы добавили еще один чужой ключ на строку с группой, если без него так не обойтись.
И всё бы само собой нормализовалось.
Более детально не отвечу, так как структуру таблиц (SHOW CREATE TABLE ) Вы не привели. | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 11:02)
| | CREATE TABLE `mt_partgroups` (
`group_id` mediumint(9) NOT NULL auto_increment,
`group_name` varchar(100) NOT NULL,
`group_parent` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `mt_partsdeclaration` (
`id` int(10) unsigned NOT NULL auto_increment,
`author_id` int(11) NOT NULL,
`prod` mediumint(9) NOT NULL,
`model_id` smallint(5) unsigned NOT NULL,
`modif_id` smallint(5) unsigned NOT NULL,
`modif_name` varchar(50) NOT NULL,
`part_group` varchar(10) NOT NULL,
`part_type` tinyint(4) NOT NULL,
`part_name` varchar(70) NOT NULL,
`price` int(10) unsigned NOT NULL,
`state` tinyint(4) NOT NULL,
`presence` tinyint(4) NOT NULL,
`haggle` tinyint(4) NOT NULL,
`description` text NOT NULL,
`city` varchar(50) NOT NULL,
`contact_face` varchar(100) NOT NULL,
`face_type` tinyint(4) NOT NULL,
`tel_1` varchar(100) NOT NULL,
`tel_2` varchar(100) NOT NULL,
`tel_3` varchar(100) NOT NULL,
`foto_0` varchar(25) NOT NULL,
`foto_1` varchar(25) NOT NULL,
`foto_2` varchar(25) NOT NULL,
`show_profile_link` tinyint(4) NOT NULL default '0',
`placing_date` date NOT NULL,
`placing_until` date NOT NULL,
`status` tinyint(3) unsigned NOT NULL,
`looked` tinyint(3) unsigned NOT NULL,
`views` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Подгруппа означает группу, но случается так, что группа не имеет подгрупп. Ладно, понял, буду хранить только значение конечной подгруппы (или группы без подгрупп), так будет правильно, но когда уткнусуь в то, что мне помешало сделать с самого начала это, буду с Вас спрашивать :). Спасибо за помощь! | |
|
|
|
|
|
|
|
для: Zdraff
(12.04.2010 в 11:30)
| | С меня Вы спрашивать будете тогда, когда
а) закажете мне проектирование схемы,
и б) оплатите заказ.
Это при том, что ввязываться в Ваш проект я, мягко говоря, не рвусь. | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 12:13)
| | Да ладно, я шучу (там смайлик стоит), конечно, Вы мне ничем не обязаны. | |
|
|
|
|
|
|
|
для: Zdraff
(12.04.2010 в 11:30)
| | В общем, переделал, теперь в mt_partsdeclaration.part_group хранится число - ID подгруппы запчасти (или группы, если подгрупп у этой группы нет). Теперь проблема вывести все это красивым списком. Из всех испытанных, лучше всего работает запрос
SELECT
mt_partgroups.*,
count(mt_partsdeclaration.id) AS count
FROM mt_partgroups, mt_partsdeclaration
WHERE
mt_partsdeclaration.model_id = '0' AND
(mt_partgroups.group_parent = '0' OR
mt_partsdeclaration.part_group = mt_partgroups.group_id) AND
mt_partsdeclaration.status = '0'
GROUP BY mt_partgroups.group_name
ORDER BY mt_partgroups.group_name ASC
|
Он выводит все группы и подгруппы, в которых есть хоть одна запчасть. Но неправильно считает кол-во запчастей в группах. Пробовал через left join - та же фигня. Подскажите, пожалуйста, как реализовать. | |
|
|
|
|
|
|
|
для: Zdraff
(12.04.2010 в 14:09)
| | Сделал двумя запросами, тему закрываю, спасибо Trianon за помощь еще раз. | |
|
|
|
|