如何选择name,max(从名称上加入的表中的值)?

时间:2018-04-05 05:13:48

标签: mysql sql

摘要:我有一个包含forums表和posts表的论坛。每个帖子都有一个唯一的ID(一个自动递增的整数),每个帖子都引用一个forums.id

我尝试发出SELECT查询,检索所有论坛名称,所有论坛ID,然后检索与该论坛相关联的最高posts.id

论坛中可能有没有帖子,在这种情况下,我希望max-posts-id为0。

论坛表:

| ID | Name |
|----|------|
| 1  | Dogs |
| 2  | Food |
| 3  | Work |

帖子表格:

| ID | Forum_ID | Author | Text |
|----|----------|--------|------|
| 42 | 1        | Mr. S  | foo  |
| 43 | 3        | Mr. Y  | bar  |
| 44 | 1        | Ms. X  | baz  |
| 45 | 2        | Ms. A  | foo  |
| 46 | 1        | Mr. M  | foo  |
| 47 | 3        | Ms. A  | bar  |
| 48 | 2        | Mr. L  | baz  |

期望的结果:

| Forum_ID | Name | Max_Posts_ID |
|----------|------|--------------|
| 1        | Dogs | 46           |
| 2        | Food | 48           |
| 3        | Work | 47           |

我的尝试

SELECT 
    forums.id AS id,
    forums.name AS name,
    COALESCE(MAX(SELECT id FROM posts WHERE forums.id = ?), 0)
JOIN
    posts ON forums.id = posts.forum_id;

但我不认为我可以将参数传递给我的嵌套SELECT查询,我不认为这是正确的方法。我该怎么做呢?

4 个答案:

答案 0 :(得分:1)

您可以使用LEFT JOIN和聚合:

SELECT f.id      AS id,
       f.name    AS name,
       COALESCE(MAX(p.id),0) AS Max_Posts_ID
FROM Forums f
LEFT JOIN Posts p
  ON f.Id = p.forum_id
GROUP BY f.id, f.name
ORDER BY f.id;

答案 1 :(得分:1)

解决您的问题:

<强>的MySQL

SELECT fs.id AS Forum_ID ,
       fs.name AS Name,
       IFNULL(MAX(ps.ID),0) AS Max_Posts_ID  
FROM forums fs
LEFT JOIN posts ps 
ON fs.id = ps.forum_id
GROUP BY fs.id,fs.name;

链接到MySQL演示:

  

http://sqlfiddle.com/#!9/a18ab2/1

<强> MSSQL

SELECT fs.id AS Forum_ID ,
       fs.name AS Name,
       ISNULL(MAX(ps.ID),0) AS Max_Posts_ID  
FROM forums fs
LEFT JOIN posts ps 
ON fs.id = ps.forum_id
GROUP BY fs.id,fs.name;

链接到MSSQL演示:

  

http://sqlfiddle.com/#!18/a18ab/2

<强>输出:

Forum_ID    Name    Max_Posts_ID
 1          Dogs     46
 2          Food     48
 3          Work     47

答案 2 :(得分:0)

让我通过 correlation 子查询

更正您当前的尝试
SELECT 
       id AS id,
       name AS name,
       (SELECT COALESCE(MAX(ID), 0) FROM Posts where forum_id = f.Id) AS Max_Posts_ID 
FROM Forums f 

更正:

  • 您的外部查询没有from子句
  • 子查询未使用id forum_id
  • 引用外部查询Posts

答案 3 :(得分:0)

链接到代码:http://tpcg.io/pI2HO5

BEGIN TRANSACTION;

/* Create a table called NAMES */
CREATE TABLE Forums (Id integer PRIMARY KEY, Name text);

/* Create few records in this table */
INSERT INTO Forums VALUES(1,'Dogs');
INSERT INTO Forums VALUES(2,'Food');
INSERT INTO Forums VALUES(3,'Work');

/* Create a table called NAMES */
CREATE TABLE Posts (Id integer PRIMARY KEY, forId integer);

/* Create few records in this table */
INSERT INTO Posts VALUES(42,1);
INSERT INTO Posts VALUES(43,3);
INSERT INTO Posts VALUES(64,1);
INSERT INTO Posts VALUES(45,2);
INSERT INTO Posts VALUES(46,1);
INSERT INTO Posts VALUES(47,3);
INSERT INTO Posts VALUES(48,2);
INSERT INTO Posts VALUES(51,2);


COMMIT;

/* Display all the records from the table */
SELECT Distinct forId as Forum_Id, Posts.id, (Select Name from Forums where forId == Forums.id) FROM Posts,Forums GROUP BY Posts.forId;

Output : 

1|64|Dogs
2|51|Food
3|47|Work