[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не знаю как сделать выборку!
gsnzone
Привет! Имеется интернет-магазин. Каждый товар должен иметь параметры. Реализовал точно так, как описано здесь: _http://softtime.ru/forum/read.php?id_forum=3&id_theme=88061

все работает, все хорошо. Теперь у меня вопрос - как это все заставить грамотно выводить методом get?
К примеру, урл имеет вид

index.php?name=shop&op=filter&razmer=1&color=10

выводятся товары, имеющие размер 1 и цвет 10 (красный, к примеру).

работает прекрасно, но если хоть по одному из get-параметров нет ни одного совпадения в базе, она не выводит ничего. Как это обойти? то есть нужно сделать проверку по каждому параметру? как такая функция (параметры) реализована в других движках? (наш - самописный)

Спасибо!
Guest
and заменить на or?
gsnzone
Цитата (Guest @ 19.10.2015 - 13:43)
and заменить на or?

нет, не вариант, наверное…

чтобы было немного понятнее: запрос в данный момент выглядит у меня примерно так:

SELECT a.* FROM products a

JOIN products_params_links a1 ON a.lid=a1.lid AND a1.id_attribute=1 AND a1.id_value=1
JOIN products_params_links a2 ON a.lid=a2.lid AND a2.id_attribute=2 AND a2.id_value=2


с каждый новым параметром get, добавляется соответствующий JOIN

то есть на этом примере: верхний join это размер, а нижний - цвет.
123456
зачем добавлять для каждого параметра join?

SELECT a.* FROM products a 
JOIN products_params_links a1 ON a.lid=a1.lid AND (
(
a1.id_attribute=1 AND a1.id_value=1) OR
(a2.id_attribute=2 AND a2.id_value=2)
)
gsnzone
Цитата (123456 @ 21.10.2015 - 13:09)
зачем добавлять для каждого параметра join?

SELECT a.* FROM products a 
JOIN products_params_links a1 ON a.lid=a1.lid AND (
(
a1.id_attribute=1 AND a1.id_value=1) OR
(a2.id_attribute=2 AND a2.id_value=2)
)

спасибо, но:

#1054 - Unknown column 'a2.id_attribute' in 'on clause'

причем в именах таблиц и ячеек 100% не напутано!

upd. а вот так чтото выводит! сейчас буду разбираться, то или не то.

SELECT a.title FROM asershop_products a 
JOIN asershop_products_params_links a1 ON a.lid=a1.lid AND (
(
a1.id_attribute=3 AND a1.id_value=1) OR
(a[b]1[/b].id_attribute=2 AND a[b]1[/b].id_value=10)
)
gsnzone
спасибо, 123456! вроде в правильном направлении мысль, но немного не то!

смотрим. урл такой = /index.php?name=shop&op=filter&tkan=10&razmer=6

Предположим, это магазин футболок.
пользователь включил фильтр:

Ткань: Хлопок (в урле это tkan = 10;
Размер: XXL (в урле это razmer = 6).

запрос в скрипте при этом:

SELECT a.* FROM products a JOIN products_params_links a1 ON a.lid=a1.lid AND (a1.id_attribute=2 AND a1.id_value=10) OR (a1.id_attribute=3 AND a1.id_value=6) )

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

если клиент хочет посмотреть все красные футболки из хлопка больших размеров, ему должно вывести только их! но проблема в том что если все таки использовать AND, а не OR, то в том случае, если в базе нет какого то из параметров, то не выводится ничего! а нужно, чтобы выводило то, что есть. например, если нет ни одной красной футболки, то пусть остаются все остальные параметры (хлопок + большие размеры).

============

то есть такой запрос, само собой, вернет пустой результат:

SELECT DISTINCT a.lid, a.cid, a.title, a.image, a.price, a.oldprice, a.totalcomments, a.status, a.keyw, a.keyw_visible, a.custom_url, a.visibleparams
FROM asershop_products a
JOIN asershop_products_params_links a1 ON a.lid = a1.lid
AND (
(

a1.id_attribute =999
AND a1.id_value =555
)
AND (
a1.id_attribute =2
AND a1.id_value =10
)
AND (
a1.id_attribute =3
AND a1.id_value =6
)
)


потому что по первому параметру: "a1.id_attribute =999 AND a1.id_value =555" в базе ничего нет. соответственно, я хочу, чтобы такие параметры как-то исключались из запроса, чтобы выдавать то, что возможно!
123456
Цитата
вернет пустой результат:

одно поле не может одновременно быть равно нескольким значениям
Цитата
(
a1.id_attribute =999
AND a1.id_value =555
)
AND (
a1.id_attribute =2
AND a1.id_value =10
)
AND (
a1.id_attribute =3
AND a1.id_value =6
)

kaww
Если правильно понял, то как-то так:
select a.*,count(1) as cnt from asershop_products as a
left join asershop_products_params_links as a1 ON a.lid = a1.lid
where (a1.lid is null or (a1.id_attribute =999 and a1.id_value =555))
or (a1.lid is null or (a1.id_attribute =2 and a1.id_value =10))
group by a.lid having cnt = 2

,где 2 - количество параметров по которым выпоняется поиск
gsnzone
Спасибо, буду пробовать!
kaww
gsnzone, ну да, немного не то. Вот так:
select a.*, a1.lid from asershop_products as a
left join asershop_products_params_links as a1 ON a.lid = a1.lid
where (a1.lid is null or (a1.id_attribute =26 and a1.id_value =31))
or (a1.lid is null or (a1.id_attribute =27 and a1.id_value =32))
group by a.lid having a1.lid is not null

http://sqlfiddle.com/#!9/b4fa4/3/0
Быстрый ответ:

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