2012-08-09 52 views
10

假設我有兩個表在一對多關係中。mysql加入限制1

而且,我想從每個主記錄中選擇列以及相關表中的第一條記錄。

我嘗試了一些方法,但它只是不走......

在這裏,我結束了這個SQL小提琴:

http://sqlfiddle.com/#!2/39fdb/3

的問題存在,它只是不能引用.ID從一個子選擇。

這是不行的,當然,但它只是所有我能想到的

select a.*,b.* from event a left join 
(select * from event_pictures where a.ID=article limit 1) 
b on a.ID=b.article; 

關於如何解決它的任何想法?

回答

14

不,您不能在加入a的子選項中引用a.ID。您可以執行以下操作,但您最好提供訂購。否則,沒有「第一」行。從表B A(或多或少)隨機行會被選中:

select a.*, b.* 
from event a 
    left join event_pictures b 
    on b.PK =      --- the PRIMARY KEY 
     (select bb.PK    --- of event_pictures 
     from event_pictures bb 
     where a.ID = bb.article 
     ORDER BY bb.something 
     limit 1 
     ) ; 
+0

我會做一個當然的命令,這只是一個簡化版本:)然而,即使隨機記錄的圖像可能是好的...讓我們看看 – Anonymous 2012-08-09 14:21:50

+0

!Thanks〜它會返回預期的結果。 '' – Anonymous 2012-08-09 14:24:00

2

如果你不關心哪個圖像獲取的物品退回,您可以選擇MINMAX圖片文章分組(而不是在你的子查詢

SQL Fiddle

+0

我不是專家,但它看起來像group by將工作更慢,並循環通過每個子集。我想我會更好地堅持極限,並通過自動增量ID字段以自然的方式排序(這有點默認不是嗎?) – Anonymous 2012-08-09 14:26:57

+0

同意,我會與ypercube更靈活的答案一起去。 – Bort 2012-08-09 14:30:07

0

這裏做一個LIMIT 1)是如何做這件事:

select e.*, ep.* 
from (select e.*, 
      (select article 
       from event_pictures ep 
       where ep.article = e.id 
       order by rand() 
       limit 1 
      ) as eparticle 
     from event e 
    ) e left join 
    event_pictures ep 
    on e.eparticle = ep.article 

子查詢找到一個randome「文章」。造成這種情況的信息,然後在加入

+0

謝謝,這是一個有趣的計劃,但在我的情況下是一個明確的矯枉過正:-) – Anonymous 2012-08-09 14:29:52

1

你可以使用最小或最大的建議已經:

select 
    e.*, 
    (
     select min(ep.img) 
     from event_pictures as ep 
     where ep2.article = e.article 
    ) as img 
from 
    event as e 

如果您想根據最高ID IMG:

select 
    e.*, 
    (
     select ep2.img 
     from event_pictures as ep2 
     where ep2.ID = last_ep.last_ID 
    ) as img 
from 
    event as e inner join -- could be a left join if necessary 
    (
     select ep.article, max(ep.ID) as last_ID 
     from event_pictures as ep 
     group by ep.article 
    ) as last_ep 
     on last_ep.article = e.ID 

這兩種方法都需要使用limit