如何确保首次出现的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)
中只允许值,那将是理想的谢谢!
答案 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)
呃,你在那里重复了85次。以一个更简单的情况,你不希望85,90出现在前两个条目中....前4个(IN子句中的值大小)idtag的出现不能是85,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,具体取决于它是真还是假。
我不太明白你在前四行中没有出现的两个值是什么意思 - 也许你可以提供一个更详细的解释(包括尝试实现这个的原因)然后我也许能够来提供更合适的解决方案。