简体   繁体   中英

MySql Inner join with COUNT

I'm stuck a bit... I have thise 3 tables:

    +---------+----------------------+------+-----+---------+----------------+
    | 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)

I have made a stored procedure which looks like this:

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 $$

As you can see i parse a language id which will return me the plans. The output looks like this:

+---------+-------+-------+-----------+------------------+
| 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)

There is only one plan for now in the database ,but it returns me 20 rows becouse there is 20 workouts in the plan workout table.My goal is to return just the COUNT() of the plan workouts.

And it should look like this:

+---------+-------+-------+-----------+------------------+
    | plan_id | image | level | name      | plan_workouts_count |
    +---------+-------+-------+-----------+------------------+
    |       1 | image | E     | Plan 1 EN |                20 |
    +---------+-------+-------+-----------+------------------+

You can use GROUP BY with COUNT , eg:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM