按比例分组

时间:2014-01-31 21:34:19

标签: mysql sql group-by match match-against

我想在同一个查询中使用ORDER BY和GROUP BY。但是,如果我使用Group BY,则相关性无法正常工作。

这是代码:

(SELECT *, MATCH(keywords) AGAINST('$busqueda') AS relevancia 
FROM libros 
WHERE MATCH(keywords) AGAINST('$busqueda') AND tipo = 'nuevo'
GROUP BY id_libro 
ORDER BY relevancia DESC, posicion ASC, precio DESC LIMIT $numero_limite)

如果我得到了相同的这个(另一个例子)但是使用前面的代码我的查询将正常工作,因为在这个例子中,order by和group by工作得很好,但没有匹配我需要的:

SELECT
   t.id, t.catid, t.name, t.userid, t.subject  
FROM
    (SELECT id,  catid,  name,  userid,  subject , thread
    FROM mensajes
    ORDER BY t.id DESC) t
GROUP BY t.thread  
LIMIT 6;

这是表(对不起,论坛不让我把照片放到没有10分):

http://www.forosdelweb.com/f86/group-match-against-respetando-relevancia-1089769/#post4561689

您可以在该链接上看到捕获/图像。

正如您在图像3上看到的那样,结果不正确。必须是id_unico 9,因为有一个位置21。

有人知道吗?

1 个答案:

答案 0 :(得分:1)

你的第二个例子是完全错误的。它使用MySQL中group by的扩展名来明确记录,以返回任意列值,而不是查询所需的值。你可以阅读它here

您可以通过使用子查询查找最大相关性来执行您想要的操作,如:

select l.*
from (SELECT *, MATCH(keywords) AGAINST('$busqueda') AS relevancia 
      FROM libros l
      WHERE MATCH(keywords) AGAINST('$busqueda') AND tipo = 'nuevo'
     ) l
where not exists (select 1
                  from libros l2
                  where l2.id_libros = l.id_libros and
                        l2.tipo = l1.typo and
                        MATCH(l2.keywords) AGAINST('$busqueda') > l.relevancia
                 )

ORDER BY relevancia DESC, posicion ASC, precio DESC
LIMIT $numero_limite;