2014-07-13 23 views
0

我有兩個表,就像這樣:子查詢有兩列

a.id,a.created,AB
b.id,b.name,b.created

我希望所有的記錄從表b按排序a.created時間戳。

我一直在嘗試以下的東西:

SELECT b.id, b.name FROM b JOIN a ON a.b = b.id ORDER BY b.created DESC 

但它總是從b返回多個記錄時,真的我要的是爲b每一行的一個一場比賽。

我試圖用SELECT子查詢:

SELECT b.id, b.name, (SELECT a.created AS a_c FROM a WHERE 
a.b = b.id) AS a_c FROM b ORDER BY a_c DESC 

但我也希望能夠拉a.id爲好。

是否有JOIN聲明我可以使用或應該使用兩個子查詢?這在我的應用程序中將是一個非常重要的功能,所以我希望性能超過標準!

+0

你試過了嗎? SELECT DISTINCT b.id,b.name FROM b JOIN a ON ab = b.id ORDER BY b.created DESC –

+1

如果您還想拉'a.id',並且有多個匹配的行'a' ,你想拉哪個? – Barmar

+0

@Barmar我想匹配'a'的最新記錄。例如'ORDER BY a.created DESC LIMIT 1' – sheppardzw

回答

1
SELECT b.id AS bid, b.name, a.id AS aid, a.created 
FROM b 
JOIN (SELECT a1.id, a1.b, a1.created 
     FROM a AS a1 
     JOIN (SELECT id, MAX(created) AS maxcreate 
      FROM a 
      GROUP BY id) AS a2 
     ON a1.id = a2.id AND a1.created = a2.maxcreate) AS a 
ON b.id = a.b 
ORDER BY a.created DESC 

提交查詢的行中a與最新的創建日期爲每個id。然後你加入b

1
select b.id, b.name, a.id a_id, a.created 
from b join (
    select b, max(a.created) max_created 
    from a 
    group by b 
) t1 on t1.b = b.id 
join a on a.b = b.id and a.created = t1.max_created 
order by a.created desc 
1
select 
    b.id 
    ,b.name 
    ,b.created as b_created 
    ,a.created as a_created 
from b 
left join a 
join (
    select b, max(created) as max_creatd 
    from a 
    group by b 
)a_min 
    on a_min.b = a.b 
    and a_min.max_creatd = a.created 
    on a.b = b.id 

這對這些數據集(SQL Server語法,以避免編寫一噸的DDL):

a as (select * from (values 
    ('A1','20140701 23:11:59', 'B1') 
    ,('A2','20140701 22:11:59', 'B1') 
)a(id,created,b) 

b as (select * from (values 
    ('B1', 'Bob', '20140701 11:59:59') 
    ,('B2', 'Bub', '20140701 10:59:59') 
)b(id,name,created) 

返回如下:

id name b_created   a_created 
---- ---- ----------------- ----------------- 
B1 Bob 20140701 11:59:59 20140701 23:11:59 
B2 Bub 20140701 10:59:59 NULL 

(2 row(s) affected) 
0

我剛剛加入表suggested in this answer

SELECT b.id, b.name, a.id AS a_id FROM b JOIN a ON 
a.id = (SELECT a.id FROM a WHERE a.b=b.id ORDER BY 
a.created DESC LIMIT 1)