2012-10-21 129 views
1

我有这个查询。子查询只返回一个值

SELECT 
    d.gid, d.channel_id 
FROM channels, (
    SELECT 
     gigs.id as gid, gigs.channel_id 
    FROM gigs 
    ORDER BY gigs.id DESC 
    LIMIT 1 
) as d 
WHERE d.channel_id = channels.id 
LIMIT 10 

我希望得到每个channels.id一个gid,而是它只返回一列。这是为什么?

演出表

+---------+------------+ 
| id  | channel_id | 
+---------+------------+ 
| 150661 | 6   | 
| 745797 | 6   | 
| 483996 | 6   | 
| 3407209 | 6   | 
| 1175022 | 5   | 
| 3238459 | 6   | 
| 711413 | 5   | 
| 524758 | 5   | 
| 154764 | 5   | 
| 1594779 | 5   | 
| 1659091 | 2   | 
| 1086768 | 6   | 
| 1161320 | 8   | 
| 467394 | 5   | 
| 2877040 | 8   | 
| 2705821 | 6   | 
| 1881747 | 5   | 
| 901902 | 1   | 
| 143322 | 6   | 
| 671658 | 1   | 
+---------+------------+ 

频道表

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
| 10 | 
+----+ 
+0

你能提供你问题的样本记录吗? :D –

+0

当然。我添加了一个更简单的查询和一些示例数据 – Oleander

+0

查看我更新的答案。 –

回答

2

试试这个,

SELECT a.id, b.max_ID 
FROM channels a 
     INNER JOIN 
     (
      SELECT channel_ID, MAX(id) max_ID 
      FROM gigs 
      GROUP BY channel_ID 
     ) b ON a.id = b.channel_ID 

SQLFiddle Demo

基本上,我以前INNER JOIN来仅显示来自channels的表格,该表格在gigs表格上至少有记录。如果你想显示列表,即使没有gigs表中的匹配,那么你应该使用LEFT JOIN来代替。

+0

同样的事情,查询只返回一个结果,而不是10. – Oleander

+0

哦,我忘了提及,因为你没有聚合任何列,所以你需要删除'GROUP BY'子句。 –

+0

和以前一样:) – Oleander

-2
SELECT id, (SELECT id FROM Gigs WHERE channel_id = c.id ORDER BY id DESC LIMIT 1) As GigID 

FROM channels c 
+0

这只会工作,如果我只想'gigs.id'。我需要'gigs.id'和'gigs.channel_id',这就是我使用内部选择的原因。 – Oleander