Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с запросом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
kappa
Отправлено: 11 Декабря, 2012 - 13:42:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




Добрый день, уважаемые.
Помогите доделать запрос.
Картинку с таблицей прикрепил.

У меня в таком запросе выводит все попавшие shop_options_attribut_id

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM
  3. shop_product_profile WHERE shop_options_attribut_id IN (1,11,2) GROUP BY shop_product_id


А нужно чтобы получить только shop_product_id 54 поскольку в нем только есть shop_options_attribut_id IN (1,11,2)
Прикреплено изображение (Нажмите для увеличения)
Безымянный.png
 
 Top
EuGen Администратор
Отправлено: 11 Декабря, 2012 - 13:51:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




На самом деле все печально - нужен тройной JOIN в терминах реляционного запроса. Что хуже - если значений будет больше трех, то и число JOIN возрастет соответственно.
Существует возможность "схитрить". Но решение это - плохое, потому как зависит от СУБД и потому как использует обработку строк. Корректнее будет построить архитектуру так, чтобы избавиться от необходимости в описанном поиске.
Собственно, "плохое" решение:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.   shop_product_id,
  3.   GROUP_CONCAT(DISTINCT shop_options_attribut_id ORDER BY shop_options_attribut_id SEPARATOR ',') AS puppet
  4. FROM
  5.   shop_product_profile
  6. GROUP BY
  7.   shop_product_id
  8. HAVING
  9.   LOCATE('1,2,11', puppet);

- разумеется, в скрипте обязательно подставлять в LOCATE отсортированный массив значений, склеенный через запятую.
При этом не требуется ни уникальность значений, ни наличие тех и только тех id, что требуется найти (подпоследовательности тоже найдутся)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Декабря, 2012 - 14:18:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если атрибуты для продукта уникальны, и нужны только удовлетворяющие всем, можно подсчитать count и отсеить неподходящие варианты.

Примером на PHP проще показать зависимость:
PHP:
скопировать код в буфер обмена
  1. $rgAttrib = array(1,11,2);
  2. $sSQL = "SELECT *
  3. FROM
  4. shop_product_profile WHERE shop_options_attribut_id IN (".join(',', $rgAttrib).") GROUP BY shop_product_id having count(0)=".count($rgAttrib);


-----
PostgreSQL DBA
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 11:27:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




Спасибо EuGen, Мелкий за такие интересные финты с БД.

Пытаюсь подсчитать количество записей, но в результате получаю единичное количество строк, что я делаю не так ?

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT 0) AS count_for_page
  2. FROM
  3. shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.  HAVING count(0)= 3
 
 Top
EuGen Администратор
Отправлено: 12 Декабря, 2012 - 11:30:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




kappa пишет:
SELECT COUNT(DISTINCT 0)

Некорректно. Укажите поле, по которому нужен уникальный подсчет.
kappa пишет:
HAVING count(0)= 3

- вероятно, имеется ввиду count_for_page ?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 11:58:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




Я пытаюсь запросом подсчитать количество записей из того что привел Мелкий

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT shop_product_id) AS count_for_page
  2. FROM
  3. shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.  HAVING count(0)= 3


по идеи нужно еще сделать группировку и по count_for_page, но так не получается.
Что в результате получаю три строки в count_for_page.
А пытаюсь получить одну строку где в результате количество найденных товаров.

EuGen
Может что посоветует по поводу структуры БД.
Делал для того чтобы можно было осуществлять поиск по всевозможным shop_options.
К примеру
shop_category - стационарный компьютер
shop_options - размер жесткого диска
-shop_options_attribut - 250 ГБ
-shop_options_attribut - 300 ГБ
-shop_options_attribut - 500 ГБ
Прикреплено изображение (Нажмите для увеличения)
Diagram 1.png
 
 Top
EuGen Администратор
Отправлено: 12 Декабря, 2012 - 12:17:21
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Если данных достаточно много, то запрос, что я приводил выше, Вам не подойдет совсем.
Запрос с использованием COUNT же имеет ограничение - он может находить лишь точные совпадения (то есть подмножества в результат не попадут). Если устраивает - то вполне.

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

Ну и
CODE (SQL):
скопировать код в буфер обмена
  1.     SELECT COUNT(DISTINCT shop_product_id) AS count_for_page
  2.     FROM
  3.     shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.      HAVING count_for_page=3

- насколько я понимаю.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 13:13:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




EuGen
Учту в следующий раз перед проектированием.

Что то не то с COUNT, возвращает одну строку (как и надо) count_for_page но с результатом NULL.
 
 Top
EuGen Администратор
Отправлено: 12 Декабря, 2012 - 13:17:57
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




kappa пишет:
но с результатом NULL.

Результатом чего?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 13:45:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




EuGen пишет:
Результатом чего?


Я использую Framework и для пагинатора необходимо указать количество записей.
А результат пытаюсь получить: Количество записей которые совпадают с условием про что писал Мелкий.
 
 Top
EuGen Администратор
Отправлено: 12 Декабря, 2012 - 13:58:03
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В SQL результат корректен? (консоль/pma и т.п.)
Ну и еще, думаю, что
Цитата:
COUNT(DISTINCT shop_product_id)

- не то, что требуется.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT shop_options_attribut_id) AS count_for_page, shop_product_id
  2.     FROM
  3.     shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.      HAVING count_for_page=3

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 15:43:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




EuGen Спасибо за помощь.
Оно то все то, только чтобы мне получить нужную цифру.
Нужно сделать так:

PHP:
скопировать код в буфер обмена
  1. $result = "SELECT COUNT(DISTINCT shop_options_attribut_id) AS count_for_page, shop_product_id
  2.    FROM
  3.    shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.     HAVING count_for_page=3"
  5.  
  6. echo "Нужная мне цифра".count($result);


А я этой нужной цифры пытался добиться в одном запросе SQL

(Отредактировано автором: 12 Декабря, 2012 - 15:46:33)

 
 Top
EuGen Администратор
Отправлено: 12 Декабря, 2012 - 15:53:56
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(1) FROM (SELECT COUNT(DISTINCT shop_options_attribut_id) AS count_for_page, shop_product_id
  2.         FROM
  3.         shop_product_profile WHERE shop_options_attribut_id IN (1,11,10) GROUP BY shop_product_id
  4.          HAVING count_for_page=3)

- либо использовать WITH ROLLUP


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kappa
Отправлено: 12 Декабря, 2012 - 17:40:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 349
Дата рег-ции: Апр. 2011  


Помог: 3 раз(а)




EuGen Спасибо Вам большое, это то что нужно.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB