MySQL:首先对每个事件进行排序,在剩下的事件之后

时间:2013-12-23 15:35:54

标签: mysql sql-order-by

如何确保首次出现的idtag列不重复?

示例:前4个(IN子句中的值大小)idtag出现次数不能为85,85,85,90

数据库架构:http://sqlfiddle.com/#!2/0a683/2

我不使用group by,因为有时我需要在IN子句中限制多于id的数量。我使用的示例:

SELECT
tr.idreceita,
tr.idtag
FROM tagreceita tr
WHERE tr.idtag IN (85,88,90)
GROUP BY tr.idtag
LIMIT 4

如果它产生4行且 tr.idtag IN(85,88,90)

中只允许值,那将是理想的

谢谢!

2 个答案:

答案 0 :(得分:1)

正确的方法是使用聚合:

SELECT min(tr.idreceita), tr.idtag
FROM tagreceita tr
WHERE tr.idtag IN (85,88,90)
group by tr.idtag;

编辑:

我知道,有时你想要in列表中的更多内容。在这种情况下,最简单的方法可能是将结果随机化:

select tr.idreceita, tr.idtag
from tagreceita tr
where tr.idtag IN (85,88,90)
order by rand();

这不保证唯一性,但它是一个简单的解决方案。

编辑II:

获得平衡结果的正式解决方案使用变量(或几乎任何其他数据库中的row_number()):

select idreceita, idtag
from (select tr.idreceita, tr.idtag,
             @rn := if(@idtag = tr.idtag, @rn + 1, 1) as rn,
             @idtag := tr.idtag
      from tagreceita tr cross join
           (select @rn := 0, @idtag := -1) const
      where tr.idtag IN (85, 88, 90)
      order by tr.idtag
     ) t
order by rn, idtag
order by rand();

答案 1 :(得分:0)

  

前4个(IN子句中的值大小)idtag的出现不能是85,85,85,90

呃,你在那里重复了85次。以一个更简单的情况,你不希望85,90出现在前两个条目中....

SELECT
tr.idreceita,
tr.idtag
FROM tagreceita tr
WHERE tr.idtag IN (85,88,90)
ORDER BY idtag IN (85,90), idtag

id IN (85,90)的值为0或1,具体取决于它是真还是假。

我不太明白你在前四行中没有出现的两个值是什么意思 - 也许你可以提供一个更详细的解释(包括尝试实现这个的原因)然后我也许能够来提供更合适的解决方案。