Заявка

11 отговора 774 прегледа
#1

Заявка

Как бихте пренаписали тази заявка без да използвате подзаявка

SELECT groupname, pr_c, (SELECT SUM(oc) from products WHERE product_group=groupname) AS ordc from groups;

Отговор
в отговор на Mapтин Гeoprиeв #2

Re: Заявка

а заебете измислих си го :)

select groupname , pr_c, IF(pr_c>0, sum(oc) , 0) as allbuyed from groups, products where product_group=groupname AND product_group!="" GROUP BY groupname;

Редактирано от Mapтин Гeoprиeв на

Отговор
в отговор на Mapтин Гeoprиeв #3

Re: Само да попитам ..

Откъде се пръкна това
product_group!=""
дето го нямаше в първоначалния вариант?

Повече по темата за използване на IF() с агрегатни функции има в ето тази чудесна статия

[линк]

salle.online.bg/sig
Отговор
в отговор на salle #4

Всъщност не съм го измислил...

Ами ситуацията е следната

Таблицата за групите

mysql> describe groups;
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| ind | bigint(10) unsigned | | PRI | NULL | auto_increment |
| groupname | varchar(40) | | | | |
| pr_c | int(10) unsigned | | | 0 | |
+-----------+---------------------+------+-----+---------+----------------+
(Не намирам откъде да задам да го изведе като код)

Таблицата за продуктите

mysql> describe products;
+---------------------+---------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+------------+----------------+
| ind | bigint(10) unsigned | | PRI | NULL | auto_increment |
| product_name | tinytext | | | | |
| product_group | varchar(40) | | | | |
| product_description | text | | | | |
| thumbimageurl | tinytext | | | | |
| fullsizeimageurl | tinytext | | | | |
| product_price | double | | | 0 | |
| topoffer | tinyint(4) | | | 0 | |
| dateadded | date | | | 0000-00-00 | |
| oc | int(10) unsigned | | | 0 | |
+---------------------+---------------------+------+-----+------------+----------------+
(Не намирам откъде да задам да го изведе като код)

и целта на заявката е да се извлекат
името на групата(groupname), броя продукти в групата (pr_c), и сумата от полето брой купени (oc) за всеки продукт който е от групата groupname, а ако няма група просто да се изведе името на групата и броя на продуктите в нея.

Примерно тази заявка върши работа, но когато има група която няма продукти в нея, тази група не се показва
select groupname , pr_c, sum(oc) as allbuyed from groups, products where product_group = groups.groupname GROUP BY groupname;
та аз искам когато има продукти от groupname да извлече sum(oc) за всички продукти с тази група а ако няма просто да извлече groupname, pr_c и NULL или нула за полето allbuyed.

Не съмкой знае колко запознат с SQL и сигурно има много начини да се направи това обаче аз не ги знам, само че въпроса е това да стане без подзаявка, иначе с подзаявка е супер лесно.

Редактирано от Mapтин Гeoprиeв на

Отговор
в отговор на Mapтин Гeoprиeв #5

Re: LEFT JOIN

SELECT groupname , pr_c, SUM(oc) AS allbuyed
FROM groups LEFT JOIN products ON(product_group = groups.groupname) GROUP BY groupname;

salle.online.bg/sig
Отговор
в отговор на salle #6

Re: LEFT JOIN

еее човек мерси много, бачка перфектно тва :) явно ще трябва да седна да почета повече за SQL а не само това което ми трябва :) айде пак МЕРСИ!!

Отговор
в отговор на salle #7

Re: LEFT JOIN

Hey salle,

njamach li pat kam Germania, s udovolstvie bich si pogovorila s teb za prelestite na RIGHT JOIN...

Отговор
в отговор на nea #8

Re: LEFT JOIN

Що пък в Германия?

И защо точно за RIGHT, че пък и за JOIN?

За последно бях във Франкфурт преди месец ама си говорихме за други работи с колегите.

salle.online.bg/sig
Отговор
в отговор на salle #9

Re: LEFT JOIN

Hi salle,

tova s JOIN schega besche, ostanala sam sas vpetchatlenie tche levija ti e malko slabost.

V germania jiveja, v BG letja edin pat na tri godini.

Mnogo pozdravi

Meggi

Отговор
в отговор на nea #10

Re: LEFT JOIN

не че засега ме бърка това, ама когато в таблицата на групите има групи с еднакви имена се извежда само един път това име, как би станало така че да се изведе това което се изкаше преди но да се изведат и повтарящите се групи като за тях си се смята пак sum(oc) за продуктите с тая група

Отговор
в отговор на Mapтин Гeoprиeв #11

Re: LEFT JOIN

SELECT groupname , pr_c, SUM(oc) AS allbuyed
FROM groups LEFT JOIN products ON(product_group = groups.groupname)
ORDER BY SUM(oc) ASC;

Отговор
в отговор на Mapтин Гeoprиeв #12

Re: LEFT JOIN

Може би нещо такова:
SELECT groups.ind, groupname , pr_c, SUM(oc) AS allbuyed
FROM groups LEFT JOIN products ON(product_group = groups.groupname) GROUP BY groups.ind, groupname;

По принцип при използване на агрегатни функции всичко, което не е агрегатна функция трябва да се включва в Group by клаузата. Доколкото знам MySQL не следи за точно спазване на това изискване, но това не означава че стойностите, която връща в този случай (напр. за pr_c) са еднозначно определени.

Отговор