2010-04-16 9 views
6

Hace un tiempo trabajé en un proyecto de MS-SQL y recuerdo una cosa de "SI ES". Lo probé en un proyecto MySQL y no funcionó.MySQL "IS IN" equivalente?

¿Hay un equivalente? ¿Solución alternativa?

Ésta es la consulta completa Estoy intentando ejecutar:

SELECT * 
FROM product_product, product_viewhistory, product_xref 
WHERE 
(
(product_viewhistory.productId = product_xref.product_id_1 AND product_xref.product_id_2 = product_product.id) 
OR 
(product_viewhistory.productId = product_xref.product_id_2 AND product_xref.product_id_1 = product_product.id) 
) 
AND product_product.id IS IN 
    (SELECT DISTINCT pvh.productId 
    FROM product_viewhistory AS pvh 
    WHERE pvh.cookieId = :cookieId 
    ORDER BY pvh.viewTime DESC 
    LIMIT 10) 
AND product_viewhistory.cookieId = :cookieId 
AND product_product.outofstock='N' 
ORDER BY product_xref.hits DESC 
LIMIT 10 

Es bastante grande ... pero la parte que me interesa es:

AND product_product.id IS IN 
    (SELECT DISTINCT pvh.productId 
    FROM product_viewhistory AS pvh 
    WHERE pvh.cookieId = :cookieId 
    ORDER BY pvh.viewTime DESC 
    LIMIT 10) 

Lo que básicamente dice que quiero la productos para estar en el "top 10" de esa sub consulta.

¿Cómo lo lograrías con MySQL (al tratar de ser eficiente)?

+0

¿No es lo mismo que '' en MySQL? – armandino

+1

IN es lo que está buscando, pero esto realmente debería implementarse utilizando un JOIN en lugar de una subconsulta. –

+0

Por favor asesorar sobre el "JOIN". Porque de todos modos, mysql no permite "LIMIT" dentro de "IN". Entonces, ¿debo unirme? –

Respuesta

15

Estás buscando IN:

AND product_product.id IN 
    (SELECT DISTINCT pvh.productId 
    FROM product_viewhistory AS pvh 
    WHERE pvh.cookieId = :cookieId 
    ORDER BY pvh.viewTime DESC 
    LIMIT 10) 
+1

ahhhhhhhhhhhhhh –

+0

"Esta versión de MySQL aún no admite 'LIMIT & IN/ALL/ANY/ALGUNA subconsulta'". Supongo que este es otro problema ... –

2

Trate IN (no "es")