2012-08-09 10 views
10

Supongamos que tengo dos tablas en una relación de uno a muchos.mysql join with limit 1

Y, quiero seleccionar columnas de cada registro principal junto con el primer registro de una tabla relacionada.

me trataron algunos aspectos, pero simplemente no se va ...

Aquí termino con este SQL violín:

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

El problema no es que simplemente no puede hacer referencia a una .ID de una subselección.

Esto no funciona, por supuesto, pero es simplemente todo lo que podía pensar

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

Cualquier ideas sobre cómo solucionarlo?

Respuesta

14

No, no puede hacer referencia a a.ID en una subselección que se une al a. Puede hacer lo siguiente, pero es mejor que proporcione un pedido. De lo contrario, no hay una "primera" fila. Se seleccionará un (más o menos) la fila azar de la Tabla B:

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

Voy a hacer un pedido, por supuesto, esta es solo una versión simplificada :) Sin embargo, incluso el registro aleatorio con una imagen podría estar bien ... Veamos – Anonymous

+0

! Gracias ~ devuelve el resultado esperado. '' – Anonymous

2

Si no le importa qué imagen es retornada para un artículo, puede seleccionar la imagen o MINMAX agrupados por artículo (en lugar de haciendo un LIMIT 1) en su subconsulta

SQL Fiddle

+0

No soy un experto, pero parece que el grupo por trabajará más lento y recorrerá cada subconjunto. Supongo que me quedaré con el límite, y los ordenaré de forma natural mediante un campo de ID de incremento automático (que es un poco predeterminado ¿no?) – Anonymous

+0

De acuerdo, me gustaría ir con la respuesta más flexible de ypercube. – Bort

0

Aquí es una manera de hacerlo:

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 

La subconsulta encuentra un "artículo" randome. La información de este se unió a continuación, en

+0

Gracias, es un esquema interesante pero una exageración definitiva en mi caso :-) – Anonymous

1

Usted podría utilizar valores mínimos y máximos como se sugiere ya:.

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

Si desea img basado en alto ID:

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 

Ninguno de los enfoques requiere la uso de limit.