Заявка
11 отговора
774 прегледа
Заявка
Как бихте пренаписали тази заявка без да използвате подзаявка
SELECT groupname, pr_c, (SELECT SUM(oc) from products WHERE product_group=groupname) AS ordc from groups;
SELECT groupname, pr_c, (SELECT SUM(oc) from products WHERE product_group=groupname) AS ordc from groups;
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;
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в на
Re: Само да попитам ..
Откъде се пръкна това
product_group!=""
дето го нямаше в първоначалния вариант?
Повече по темата за използване на IF() с агрегатни функции има в ето тази чудесна статия
[линк]
salle.online.bg/sig
product_group!=""
дето го нямаше в първоначалния вариант?
Повече по темата за използване на IF() с агрегатни функции има в ето тази чудесна статия
[линк]
salle.online.bg/sig
Всъщност не съм го измислил...
Ами ситуацията е следната
Таблицата за групите
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 и сигурно има много начини да се направи това обаче аз не ги знам, само че въпроса е това да стане без подзаявка, иначе с подзаявка е супер лесно.
Таблицата за групите
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в на
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
FROM groups LEFT JOIN products ON(product_group = groups.groupname) GROUP BY groupname;
salle.online.bg/sig
Re: LEFT JOIN
еее човек мерси много, бачка перфектно тва :) явно ще трябва да седна да почета повече за SQL а не само това което ми трябва :) айде пак МЕРСИ!!
Re: LEFT JOIN
Hey salle,
njamach li pat kam Germania, s udovolstvie bich si pogovorila s teb za prelestite na RIGHT JOIN...

njamach li pat kam Germania, s udovolstvie bich si pogovorila s teb za prelestite na RIGHT JOIN...
Re: LEFT JOIN
Що пък в Германия?
И защо точно за RIGHT, че пък и за JOIN?
За последно бях във Франкфурт преди месец ама си говорихме за други работи с колегите.
salle.online.bg/sig
И защо точно за RIGHT, че пък и за JOIN?
За последно бях във Франкфурт преди месец ама си говорихме за други работи с колегите.
salle.online.bg/sig
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
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
Re: LEFT JOIN
не че засега ме бърка това, ама когато в таблицата на групите има групи с еднакви имена се извежда само един път това име, как би станало така че да се изведе това което се изкаше преди но да се изведат и повтарящите се групи като за тях си се смята пак sum(oc) за продуктите с тая група
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;
FROM groups LEFT JOIN products ON(product_group = groups.groupname)
ORDER BY SUM(oc) ASC;
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) са еднозначно определени.
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) са еднозначно определени.