Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Не знаю как сделать выборку!
gsnzone  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 18
Пользователь №: 28146
На форуме: 5 лет, 6 месяцев, 8 дней
Карма:




Привет! Имеется интернет-магазин. Каждый товар должен иметь параметры. Реализовал точно так, как описано здесь: _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-параметров нет ни одного совпадения в базе, она не выводит ничего. Как это обойти? то есть нужно сделать проверку по каждому параметру? как такая функция (параметры) реализована в других движках? (наш - самописный)

Спасибо!

Это сообщение отредактировал gsnzone - 19.10.2015 - 17:38
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









and заменить на or?
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
gsnzone  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 18
Пользователь №: 28146
На форуме: 5 лет, 6 месяцев, 8 дней
Карма:




Цитата (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 это размер, а нижний - цвет.

Это сообщение отредактировал gsnzone - 19.10.2015 - 17:58
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
123456  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 889
Пользователь №: 30352
На форуме: 5 лет, 1 месяц, 3 дня
Карма: 12




зачем добавлять для каждого параметра 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)
)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
gsnzone  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 18
Пользователь №: 28146
На форуме: 5 лет, 6 месяцев, 8 дней
Карма:




Цитата (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 - 21.10.2015 - 22:22
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
gsnzone  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 18
Пользователь №: 28146
На форуме: 5 лет, 6 месяцев, 8 дней
Карма:




спасибо, 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" в базе ничего нет. соответственно, я хочу, чтобы такие параметры как-то исключались из запроса, чтобы выдавать то, что возможно!

Это сообщение отредактировал gsnzone - 21.10.2015 - 23:12
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
123456  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 889
Пользователь №: 30352
На форуме: 5 лет, 1 месяц, 3 дня
Карма: 12




Цитата
вернет пустой результат:

одно поле не может одновременно быть равно нескольким значениям
Цитата
(
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
)

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 7 дней
Карма: 184




Если правильно понял, то как-то так:
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 - количество параметров по которым выпоняется поиск
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
gsnzone  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 18
Пользователь №: 28146
На форуме: 5 лет, 6 месяцев, 8 дней
Карма:




Спасибо, буду пробовать!

Это сообщение отредактировал gsnzone - 23.10.2015 - 19:19
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 7 дней
Карма: 184




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
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса