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 :: Помогите правильно сформулировать запрос Mysql

 PHP.SU

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


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

> Без описания
oxy
Отправлено: 30 Сентября, 2014 - 16:44:57
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Нояб. 2013  


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




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

Есть бд с полями

ид | имя | количество | магазин

Важно что в базе может быть несколько строк с одинаковым названием в одном магазине но с разным количеством

Задача проверить есть ли в определенном магазине вещи с названием "имя 1" в количестве больше 5

Вроде бы все вполне просто решается:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `id` FROM `таблица` WHERE `магазин`='магазин 1' AND `имя`='имя 1' GROUP BY `имя` HAVING sum(`количество`)>='5'


Но что делать когда требуется проверить есть ли в магазине 1 вещи "имя 1" в количестве 5 и "имя 2" в количестве 3 я понять не могу(
 
 Top
tato
Отправлено: 01 Октября, 2014 - 01:04:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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




oxy, а вы знаете что в данном запросе возвращается "какой-то" id?
Я к тому, что вы груперуете записи:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 1 name1
  3. 2 name2
  4. 3 name1
  5. 4 name1
  6. ----- after group by
  7. ? name1
  8. 2 name2
  9.  


Ну да ладно.

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT `id`, sum(`количество`) sum FROM `таблица` WHERE `магазин`='магазин 1' AND (`имя`='имя 1' OR `имя`='имя 2') GROUP BY `имя`
  3.  

Далее в php уже фильтруем, что нам надо, это если немного записей.
Если записей много... двумя разными запросами.


-----
просто ?: сложно
 
 Top
oxy
Отправлено: 01 Октября, 2014 - 08:50:14
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Нояб. 2013  


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




Да я вкурсе что возвращает какой то ид, мне не нужны данные, мне важен результат или что то, или ноль строк. В общем если говорите делать разными запросами, так и будем. Думал можно совместить...
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2014 - 09:37:35
Post Id



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


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


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




Имя и магазин - уникальный индекс?

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT 'exists' FROM `tablename` WHERE `магазин`=:shop_id AND (
  2. (имя=:item_1 AND количество>=:item_1_count)
  3. OR (имя=:item_2 AND количество>=:item_2_count)
  4. )

Для Mysql можно изменить запрос - получается то же самое, но компактнее и, скорей всего, формировать запрос будет удобнее:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT 'exists' FROM `tablename` WHERE `магазин`=:shop_id AND (имя, количество) IN (
  2. (:item_1, :item_1_count),
  3. (:item_2, :item_2_count)
  4. )


-----
PostgreSQL DBA
 
 Top
tato
Отправлено: 01 Октября, 2014 - 09:56:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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




Мелкий пишет:
SELECT 'exists' FROM `tablename` WHERE `магазин`=:shop_id AND (имя, количество) IN ((:item_1, :item_1_count),(:item_2, :item_2_count))


Вот Я про это тоже думал, только у него сумма из нескольких строк


-----
просто ?: сложно
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2014 - 10:46:59
Post Id



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


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


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




tato пишет:
только у него сумма из нескольких строк

В этом и весь вопрос: точно ли это так? И тогда второй вопрос: зачем?
Решение есть, довольно простое. Но сначала вопрос так ли это и зачем так сделано, иначе решение будет тупо бесполезным костылём.


-----
PostgreSQL DBA
 
 Top
oxy
Отправлено: 01 Октября, 2014 - 10:53:28
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Нояб. 2013  


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




Имя и магазин - уникальный индекс?
Нет они могут повторяться

Ну самый логичный вариант делать несколько запросов и не мучить народ)
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2014 - 11:26:35
Post Id



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


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


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




oxy пишет:
Нет они могут повторяться

Зачем?


-----
PostgreSQL DBA
 
 Top
oxy
Отправлено: 01 Октября, 2014 - 14:42:32
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Нояб. 2013  


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




Мелкий пишет:
oxy пишет:
Нет они могут повторяться

Зачем?


Вариант с магазином и товаром я взял для упрощения понимания задачи, не более.

В том то и вся проблема что надо выбирать по сумме количества. Ну если Вам не понятно так, то давайте делать выборку не по имени товара, а внесем туда еще одно поле "тип" (к примеру надо проверить есть ли в магазине 20 свитеров в сумме и 10 футболок) а повторяются они по тому что вещи могут быть разных размеров, моделей и фирм к примеру.

Короче повторяются по тому что так надо Улыбка
 
 Top
Sail
Отправлено: 01 Октября, 2014 - 15:02:04
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




oxy, можно использовать такую конструкцию:
CODE (SQL):
скопировать код в буфер обмена
  1. HAVING (sum(`количество`)>='5' AND `имя`='имя 1') OR (sum(`количество`)>='2' AND `имя`='имя 2')
 
 Top
oxy
Отправлено: 01 Октября, 2014 - 15:21:18
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Нояб. 2013  


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




Sail пишет:
oxy, можно использовать такую конструкцию:
CODE (SQL):
скопировать код в буфер обмена
  1. HAVING (sum(`количество`)>='5' AND `имя`='имя 1') OR (sum(`количество`)>='2' AND `имя`='имя 2')



Близко но мне надо вместо OR ставить AND, а с ним оно выдает пустой результат хотя в базе есть нужное количество


Хотя думаю это лучший ответ, и наиболее идеальное решение моей задачи.

(Отредактировано автором: 01 Октября, 2014 - 15:25:23)

 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2014 - 15:33:05
Post Id



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


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


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




oxy пишет:
Короче повторяются по тому что так надо

Ок. Я выяснял на всякий случай. Мой банальный вопрос "Имя и магазин - уникальный индекс?" порой читают как "поля имя и магазин - на каждом из них висит уникальный индекс?" или как-то так Радость

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(0) AS cnt FROM (
  2. SELECT `имя`, sum(количество) AS summary_cnt FROM tablename WHERE `магазин`=:shop_id AND имя IN (/*нужные имена, так можно составным индексом по магазин&имя эффективно выбирать*/)
  3. GROUP BY `имя`
  4. HAVING (имя, summary_cnt) IN ((:item_1, :item_1_cnt), (:item_2, :item_2_cnt))
  5. ) items HAVING cnt=:total_item_names_count

Так можно получить "товар есть, всё в порядке", если есть хоть одна запись в результате и "товара нету =(" если в результате 0 строк.
total_item_names_count - это общее число разных `имя`, которые надо найти. Иначе получится, что товар в наличии, если хоть один из товаров есть.

Вполне вероятно, что удобнее будет выкинуть внешний селект и на приложении понять, какие товары в наличии есть, каких нету.


-----
PostgreSQL DBA
 
 Top
tato
Отправлено: 02 Октября, 2014 - 01:08:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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





Мне кажится или кто0то уперся в архетектуру (=


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


-----
просто ?: сложно
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB