[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: люди, хелп!
dimonise
всем привет!
есть проблемка - нужно отбирать из базы (точнее из одной таблички) несколько параметров для одного товара. сделал такой запрос -
SELECT * FROM pod_value WHERE value ='10 л' AND value='Накопительный'
но я сам понимаю что это не правильно.... подскажите как правильнее будет?


 ! 

М
Идете в бан на 3 дня потом может получиться, что навсегда. надоело делать вам предупреждение на невменяемые названия тем
HardWoman




Спустя 11 минут, 45 секунд (6.06.2010 - 21:48) Ice написал(а):
Рекомендую сделать одну таблицу для товаров, а вторую для параметров этих товаров, связанные по ID. Сделать объединенную выборку и на ее основе построить многомерный массив, а затем использовать его.

Спустя 2 минуты, 25 секунд (6.06.2010 - 21:50) dimonise написал(а):
да так и сделано товары отдельно, характеристики отдельно. вот как из таблицы характеристик для одного товара выбрать несколько значений?

Спустя 28 секунд (6.06.2010 - 21:51) Rand написал(а):
Если тебе надо сделать выборку нескольких записей, в которых поле value может содержать как "10 л", так и "Накопительный", то вместо AND надо использовать OR

Спустя 5 минут, 57 секунд (6.06.2010 - 21:57) dimonise написал(а):
пробовал не катит. к примеру мне нужно выбрать бойлер с объемом 10 литров, накопительный. выбираю 10 литров, потом накопительный (фильтры ссылками сделаны и пишуться в сессию)- получаю (отдельно) бойлеры с объемом 10 л и кучу всех разных бойлеров у которых есть характеристика "накопительный"

Спустя 26 минут, 16 секунд (6.06.2010 - 22:23) waldicom написал(а):
Рекомендую в следующий раз давать темам осмысленные названия, Вы уже получали предупреждение за это.
А по теме: IN ?

Спустя 4 минуты, 28 секунд (6.06.2010 - 22:28) Rand написал(а):
Не совсем понимаю. 10 литров - это объем, а накопительный - это тип. Как это можно в базе записывать в один столбец value? Можешь структуру таблиц привести?

Спустя 4 минуты, 27 секунд (6.06.2010 - 22:32) dimonise написал(а):
можно.

_______________________________
таблица с характеристиками товара|
_______________________________|
| prod_ id | value
| |
| 1 | 10 литров
| 1 |Накопительный
| 1 |Железный


таблица с товарами |
_______________________________|
| id | name_tovar
| |
| 1 | бойлер №1
| 2 |бойлер №2
| 3 |бойлер №3

Спустя 24 минуты, 40 секунд (6.06.2010 - 22:57) Rand написал(а):
Странная организация. Какой смысл было создавать вторую таблицу, когда записи всё равно будут повторятся, в одной таблице было бы даже проще:
| id| name_tovar | value | type | mat |
++++++++++++++++++++++++++++++++++++++++
| 1 | бойлер №1 | 10 л | Накопительный | Железный |
| 2 | бойлер №2 | 10 л | Проточный | Железный |
| 3 | бойлер №3 | 10 л | Накопительный | Железный |
SELECT * FROM prod WHERE value ='10 л' AND type='Накопительный' AND mat='Железный'
Или разнес бы по таблицам все характеристики, тоже самое было-бы, только в запросе по айдишникам сравнивал бы. Хотя конечно, это не совсем катит, если кроме бойлеров есть и другие товары.

Спустя 5 минут, 53 секунды (6.06.2010 - 23:03) dimonise написал(а):
организация не странная. так нужно потому что , ну долго объяснять...
Цитата (Rand @ 6.06.2010 - 19:57)
SELECT * FROM prod WHERE value ='10 л' AND type='Накопительный' AND mat='Железный'
а это я тоже пробовал - не катит

Спустя 2 часа, 23 минуты, 57 секунд (7.06.2010 - 01:26) Ice написал(а):
Вобщем, если я правильно понял задачу, нужно вывести сам товар + его характеристики, верно?
Тогда поступаем следующим образом:

SELECT name_tovar, value FROM tovar_table t
JOIN charact_table c ON c.prod_id=t.id
WHERE t.id=...

Помогло?

Спустя 1 час, 18 минут, 27 секунд (7.06.2010 - 02:45) Gabriel написал(а):
SELECT * FROM pod_value WHERE value ='10 л' OR value='Накопительный'

туплю?

Спустя 14 часов, 17 минут, 39 секунд (7.06.2010 - 17:03) Rand написал(а):
Тут мое больное воображение напридумывало кое-чего, может поможет ))
Вариант 1: Все данные фильтруем через запрос. Подзапрос возвращает таблицу с айдишниками и количеством совпадений для каждого из них. По скольку мы указали три параметра, то далее пишем HAVING kol=3, это отбросит id, у которых совпадений меньше.
SELECT pod_value.prod_id,pod_value.value FROM pod_value,(SELECT COUNT(*) as kol, prod_id FROM pod_value WHERE value IN('10л','Накопительный','Железный') GROUP BY prod_id HAVING kol=3) as cnt WHERE pod_value.prod_id=cnt.prod_id

Для удобства можно немного изменить запрос и выводить так:
	$result=mysql_query("SELECT tovar_table.id,tovar_table.name_tovar,GROUP_CONCAT(value) as pole FROM tovar_table,pod_value,(SELECT COUNT(*) as kol, prod_id FROM pod_value WHERE value IN('10л','Накопительный','Железный') GROUP BY prod_id HAVING kol=3) as cnt WHERE pod_value.prod_id=cnt.prod_id AND pod_value.prod_id=tovar_table.id GROUP by pod_value.prod_id");
while($r=mysql_fetch_assoc($result)) {
$r1=explode(',',$r['pole']);
sort($r1);
echo $r['id']." ".$r['name_tovar']." ".$r1[0]." ".$r1[1]." ".$r1[2]."<br>";
}

Вариант 2: Выбираем все записи, потом фильтруем в скрипте.
	$result=mysql_query("SELECT tovar_table.id,tovar_table.name_tovar,GROUP_CONCAT(value) as pole FROM pod_value JOIN tovar_table ON tovar_table.id=pod_value.prod_id GROUP BY prod_id");
while($r=mysql_fetch_assoc($result)) {
$r1=explode(',',$r['pole']);
if(in_array('10л',$r1)&&in_array('Накопительный',$r1)&&in_array('Железный',$r1)) {
sort($r1);
echo $r['id']." ".$r['name_tovar']." ".$r1[0]." ".$r1[1]." ".$r1[2]."<br>";
}
}

Спустя 1 час, 4 минуты, 19 секунд (7.06.2010 - 18:07) Guest написал(а):
SELECT p1.id, p1.value, p2.value FROM pod_value as p1
JOIN pod_value as p2 ON p1.id= p2.id
WHERE p1.value = '10л' AND p2.value='Железный'

Хотя структура действительно странная!


Спустя 1 час, 4 минуты, 55 секунд (7.06.2010 - 19:12) Rand написал(а):
Тоже интересно, но данный запрос придется собирать динамически, в зависимости от количества фильтров, и другие параметры товара, которые не указаны в фильтре, не будут выбраны.

Спустя 14 часов, 29 минут, 7 секунд (8.06.2010 - 09:41) Guest написал(а):
2Rand
Не вижу трудности собрать запрос динамически! Зато не нужно изменять таблицу, если добавится какой-то параметр!

Спустя 18 минут, 17 секунд (8.06.2010 - 09:59) Rand написал(а):
А как решить вопрос по поводу выборки? В данном случае в таблице будет только два столбца - с объемом и с материалом. Но в таблице же могут быть и другие параметры товара, которые тоже нужно выбрать. Например выбираем по фильтрам 10л и Железный. Возвратится таблица, в которой будут только эти два параметра. Но один бойлер будет проточный, второй накопительный, а у третьего вообще будет какое-нибудь свойство, которого нет ни у первого, ни у второго.

Цитата
Зато не нужно изменять таблицу, если добавится какой-то параметр

Не понял. Её в любом случает изменять не нужно.

Спустя 1 час, 13 минут, 11 секунд (8.06.2010 - 11:12) Guest написал(а):
Число параметров ограничено, я так понимаю! Все зависит от объема таблицы! Можно ее заджойнить сколько угодно раз, что бы выбрать необходимые параметры! Но если таблица большая и много параметров то запрос будет "тяжелый". С другой стороны, если для каждого параметра создать поле, то запрос легче, но если нужно ввести новый параметр придеться сделать ALTER TABLE
Быстрый ответ:

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