Задать вопрос
@nata32

Как подсчитать количество строк в sql запросе?

Добрый день, есть запрос
SELECT DISTINCT
  p.text,
  wdt.text wdt,
  hgt.text hgt,
  dia.text dia
FROM " . DB_PREFIX . "product_attribute p
JOIN " . DB_PREFIX . "product_attribute wdt ON p.product_id = wdt.product_id
JOIN " . DB_PREFIX . "product_attribute hgt ON p.product_id = hgt.product_id
JOIN " . DB_PREFIX . "product_attribute dia ON p.product_id = dia.product_id
WHERE p.attribute_id = '80' and wdt.text = '".$_GET['width_id']."' and hgt.text = '".$_GET['height_id']."' and dia.text = '".$_GET['dia_id']."'

как подсчитать общее количество строк p.attribute_id = '80 ?
Прописываю SELECT DISTINCT COUNT(p.text) AS SUM
работает неправильно.
Спасибо.
  • Вопрос задан
  • 235 просмотров
Подписаться 1 Простой 22 комментария
Решения вопроса 1
@alexalexes
10.3.36-MariaDB
объясняю раскладывая все по буквам.
есть товар, который имеет несколько атрибутов, для примера возьмем 5 шт., они лежат все в одной таблице и имеют разные attribute_id, в запрос приходят 3 параметра, к примеру 200, 80, 15, пример записи в таблице
spoiler
product_id attribute_id text
1 10 200
2 10 230
3 10 200
1 12 80
2 12 80
3 12 80
1 15 15
2 15 13
3 15 15
1 80 Сони
2 80 Сони
3 80 Сони
1 90 66
2 90 60
3 90 71

по запросу нужно получить значение атрибута с attribute_id = 80 и с теми значениями которые еще пришли
то есть результат должен быть Сони и total = 2 так как всем условиям соответствует 2 товара, то есть товары с product_id 1 и 3

Вообще, в вашей задаче первым делом нужно правильно избавиться от distinct, чтобы правильно трактовать выбранные записи.
Как это сделать?
Считаем, что товарные item-ы имеют атрибут с id = 80 - по ним проходимся как по товарным записям. Все остальные id атрибутов используем как свойства записей - 10 - ширина, 12 - высота, 15 - диагональ.
Тогда запрос будет таким:
-- Тестовая выборка
with product_attribute as (select 1 product_id, 10 attribute_id, '200' text from dual union all
select 2, 10, '230' from dual union all
select 3, 10, '200' from dual union all
select 1, 12, '80' from dual union all
select 2, 12, '80' from dual union all
select 3, 12, '80' from dual union all
select 1, 15, '15' from dual union all
select 2, 15, '13' from dual union all
select 3, 15, '15' from dual union all
select 1, 80, 'Сони' from dual union all
select 2, 80, 'Сони' from dual union all
select 3, 80, 'Сони' from dual union all
select 1, 90, '66' from dual union all
select 2, 90, '60' from dual union all
select 3, 90, '71' from dual),
product as (select 1 product_id from dual union all
select 2 from dual union all
select 3 from dual
)

-- Сам запрос поиска
Select A.*,
       count(*) over () cnt -- количество товаров в результате поиска
from (SELECT p.product_id,
             -- далее, его свойства
             (select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 80) product_name, -- наименование item-а
             (select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 10) wdt,
             (select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 12) hgt,
             (select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 15) dia
        FROM product p
      ) A
where 1 = 1
  -- тут пишем поисковой довесок условий
  and A.wdt = 200
  and A.hgt = 80
  and A.dia = 15

Результат будет:
product_id product_name wdt hgt dia cnt
1	Сони	200	80	15 	2
3	Сони	200	80	15	2

2 строки, считайте их как угодно, например, через count(*) over ().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы