MySql与COUNT的内部连接
我有点困了。。。 我有三张桌子:MySql与COUNT的内部连接,mysql,Mysql,我有点困了。。。 我有三张桌子: +---------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------+------+-----+---------+--------------
+---------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------------------+------+-----+---------+----------------+
| plan_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| image | varchar(255) | NO | | NULL | |
| level | enum('E','M','H') | YES | | NULL | |
+---------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> describe plan_names;
+---------------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------------+------+-----+---------+----------------+
| plan_names_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| language_id | smallint(255) unsigned | NO | | NULL | |
| plan_id | smallint(255) unsigned | NO | | NULL | |
+---------------+------------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> describe plan_workouts;
+------------------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------------+------+-----+---------+----------------+
| plan_workouts_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| workout_id | smallint(255) unsigned | NO | | NULL | |
| plan_id | smallint(255) unsigned | NO | | NULL | |
+------------------+------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
我创建了一个如下所示的存储过程:
DELIMITER $$
CREATE PROCEDURE get_plans(IN _language SMALLINT(255))
BEGIN
SELECT p.plan_id,p.image,p.level,pn.name,pw.plan_workouts_id FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id JOIN plan_workouts AS pw ON p.plan_id = pw.plan_id WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id ,COUNT(SELECT * FROM plan_workouts WHERE ) WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id WHERE pn.language_id = _language AND ;
END $$
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_id |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 1 |
| 1 | image | E | Plan 1 EN | 2 |
| 1 | image | E | Plan 1 EN | 3 |
| 1 | image | E | Plan 1 EN | 4 |
| 1 | image | E | Plan 1 EN | 5 |
| 1 | image | E | Plan 1 EN | 6 |
| 1 | image | E | Plan 1 EN | 7 |
| 1 | image | E | Plan 1 EN | 8 |
| 1 | image | E | Plan 1 EN | 9 |
| 1 | image | E | Plan 1 EN | 10 |
| 1 | image | E | Plan 1 EN | 11 |
| 1 | image | E | Plan 1 EN | 12 |
| 1 | image | E | Plan 1 EN | 13 |
| 1 | image | E | Plan 1 EN | 14 |
| 1 | image | E | Plan 1 EN | 15 |
| 1 | image | E | Plan 1 EN | 16 |
| 1 | image | E | Plan 1 EN | 17 |
| 1 | image | E | Plan 1 EN | 18 |
| 1 | image | E | Plan 1 EN | 19 |
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
20 rows in set (0.00 sec)
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_count |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
如您所见,我解析了一个语言id,它将返回计划。
输出如下所示:
DELIMITER $$
CREATE PROCEDURE get_plans(IN _language SMALLINT(255))
BEGIN
SELECT p.plan_id,p.image,p.level,pn.name,pw.plan_workouts_id FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id JOIN plan_workouts AS pw ON p.plan_id = pw.plan_id WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id ,COUNT(SELECT * FROM plan_workouts WHERE ) WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id WHERE pn.language_id = _language AND ;
END $$
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_id |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 1 |
| 1 | image | E | Plan 1 EN | 2 |
| 1 | image | E | Plan 1 EN | 3 |
| 1 | image | E | Plan 1 EN | 4 |
| 1 | image | E | Plan 1 EN | 5 |
| 1 | image | E | Plan 1 EN | 6 |
| 1 | image | E | Plan 1 EN | 7 |
| 1 | image | E | Plan 1 EN | 8 |
| 1 | image | E | Plan 1 EN | 9 |
| 1 | image | E | Plan 1 EN | 10 |
| 1 | image | E | Plan 1 EN | 11 |
| 1 | image | E | Plan 1 EN | 12 |
| 1 | image | E | Plan 1 EN | 13 |
| 1 | image | E | Plan 1 EN | 14 |
| 1 | image | E | Plan 1 EN | 15 |
| 1 | image | E | Plan 1 EN | 16 |
| 1 | image | E | Plan 1 EN | 17 |
| 1 | image | E | Plan 1 EN | 18 |
| 1 | image | E | Plan 1 EN | 19 |
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
20 rows in set (0.00 sec)
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_count |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
数据库中目前只有一个计划,但它会返回20行,因为计划训练表中有20个训练。我的目标是只返回计划训练的COUNT()
它应该是这样的:
DELIMITER $$
CREATE PROCEDURE get_plans(IN _language SMALLINT(255))
BEGIN
SELECT p.plan_id,p.image,p.level,pn.name,pw.plan_workouts_id FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id JOIN plan_workouts AS pw ON p.plan_id = pw.plan_id WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id ,COUNT(SELECT * FROM plan_workouts WHERE ) WHERE pn.language_id = _language;
#SELECT p.plan_id,p.image,p.level,pn.name FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id WHERE pn.language_id = _language AND ;
END $$
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_id |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 1 |
| 1 | image | E | Plan 1 EN | 2 |
| 1 | image | E | Plan 1 EN | 3 |
| 1 | image | E | Plan 1 EN | 4 |
| 1 | image | E | Plan 1 EN | 5 |
| 1 | image | E | Plan 1 EN | 6 |
| 1 | image | E | Plan 1 EN | 7 |
| 1 | image | E | Plan 1 EN | 8 |
| 1 | image | E | Plan 1 EN | 9 |
| 1 | image | E | Plan 1 EN | 10 |
| 1 | image | E | Plan 1 EN | 11 |
| 1 | image | E | Plan 1 EN | 12 |
| 1 | image | E | Plan 1 EN | 13 |
| 1 | image | E | Plan 1 EN | 14 |
| 1 | image | E | Plan 1 EN | 15 |
| 1 | image | E | Plan 1 EN | 16 |
| 1 | image | E | Plan 1 EN | 17 |
| 1 | image | E | Plan 1 EN | 18 |
| 1 | image | E | Plan 1 EN | 19 |
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
20 rows in set (0.00 sec)
+---------+-------+-------+-----------+------------------+
| plan_id | image | level | name | plan_workouts_count |
+---------+-------+-------+-----------+------------------+
| 1 | image | E | Plan 1 EN | 20 |
+---------+-------+-------+-----------+------------------+
您可以将
分组依据
与计数
一起使用,例如:
SELECT p.plan_id,p.image,p.level,pn.name,COUNT(pw.plan_workouts_id) AS plan_workouts_count
FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id JOIN plan_workouts AS pw ON p.plan_id = pw.plan_id
WHERE pn.language_id = _language;
GROUP BY p.plan_id,p.image,p.level,pn.name;
您可以将
分组依据
与计数
一起使用,例如:
SELECT p.plan_id,p.image,p.level,pn.name,COUNT(pw.plan_workouts_id) AS plan_workouts_count
FROM plan AS p INNER JOIN plan_names AS pn ON p.plan_id = pn.plan_id JOIN plan_workouts AS pw ON p.plan_id = pw.plan_id
WHERE pn.language_id = _language;
GROUP BY p.plan_id,p.image,p.level,pn.name;
非常感谢先生:D非常感谢先生:D