0

System info:

$ uname -srvm
Linux 5.15.0-56-generic #62-Ubuntu SMP Tue Nov 22 19:54:14 UTC 2022 x86_64

$ mysql --version
mysql  Ver 8.0.31-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))

I am very inexperienced with MySQL & have been looking for an answer to this for about half a week. I am working with two tables named character_stats & halloffame that I want to join in a query. They look like this:

mysql> SELECT name, level FROM character_stats;
+-----------+-------+
| name      | level |
+-----------+-------+
| foo       |     0 |
| bar       |     0 |
| baz       |     3 |
| tester    |     4 |
| testertoo |     2 |
+-----------+-------+

mysql> SELECT * from halloffame;
+----+-----------+----------+--------+
| id | charname  | fametype | points |
+----+-----------+----------+--------+
|  1 | bar       | T        |      0 |
|  2 | foo       | T        |      0 |
|  3 | baz       | T        |      0 |
|  4 | tester    | T        |      0 |
|  5 | testertoo | T        |      0 |
|  6 | tester    | D        |     40 |
|  7 | tester    | M        |     92 |
|  8 | bar       | M        |     63 |
+----+-----------+----------+--------+

In my query, I want to display all the rows from character_stats & I want to join the points column from halloffame for fametype='M'. If there is no row for fametype='M', I want to set points to 0 for that character name, instead of omitting the entire row as is done in the following:

mysql> SELECT name, level, points FROM character_stats JOIN
    -> (SELECT charname, points FROM halloffame WHERE fametype='M')
    -> AS hof ON (hof.charname=name);
+--------+-------+--------+
| name   | level | points |
+--------+-------+--------+
| tester |     4 |     92 |
| bar    |     0 |     63 |
+--------+-------+--------+

So I want it to output this:

+-----------+-------+--------+
| name      | level | points |
+-----------+-------+--------+
| foo       |     0 |      0 |
| bar       |     0 |     63 |
| baz       |     3 |      0 |
| tester    |     4 |     92 |
| testertoo |     2 |      0 |
+-----------+-------+--------+

I have tried to learn how to use IFNULL, IF-THEN-ELSE, CASE, COALESCE, & COUNT statements from what I have found in documentation & answers on stackoverflow.com. But as I said, I am very inexperienced & don't know how to implement them.

The following works on its own:

SELECT IFNULL((SELECT points FROM halloffame WHERE fametype='M'
AND charname='foo' LIMIT 1), 0) as points;

But I don't know how to join it to the character_stats table. The following would work if I knew how to get the value of character_stats.name before COALESCE is called:

SELECT name, level, 'M' AS fametype, points FROM character_stats
JOIN (SELECT COALESCE((SELECT points FROM halloffame WHERE
fametype='M' AND charname=name LIMIT 1), 0) AS points) AS hof;

According to Adding Default Values on Joining Tables I should be able to use CROSS JOIN, but I am doing something wrong as it still results in Unknown column 'cc.name' in 'where clause':

SELECT name, level, points FROM character_stats
CROSS JOIN (SELECT DISTINCT name FROM character_stats) AS cc
JOIN (SELECT COALESCE((SELECT points FROM halloffame WHERE
fametype='M' AND charname=cc.name LIMIT 1), 0) AS points) AS hof;

Some references I have looked at:

AntumDeluge
  • 490
  • 1
  • 5
  • 13

1 Answers1

0

I found that I can do the following:

SELECT name, level, COALESCE((SELECT points FROM
halloffame WHERE fametype='M' AND charname=name
LIMIT 1), 0) AS points FROM character_stats;

Though I would still like to know how to do it within a JOIN statement.

AntumDeluge
  • 490
  • 1
  • 5
  • 13