2013-12-23 2 views
0

첫 번째 idtag 열 발생을 어떻게 방지 할 수 있습니까?MySQL : 남은 문자 다음에 오는 첫 번째 정렬

예 : idtag의 발생 처음 4 (IN 절 내에서 값의 크기가) 85,85,85,90

DB 스키마가 될 수 없습니다 : http://sqlfiddle.com/#!2/0a683/2 I에 의해 그룹을 사용하지 말아

, 언젠가는 내가 IN 절 안에있는 ID보다 많은 수의 ID를 제한해야하기 때문입니다. 예 내가 사용하는 경우 :

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

(85,88,90) IN tr.idtag에서 허용되는 유일한 값으로 4 개 행을 초래하는 경우 이상적 일 것이다 주셔서 감사합니다!

+0

''나는 IN 절 안에있는 ID보다 많은 수의 ID를 제한해야하기 때문에 그룹을 사용하지 않습니다. '또한이 경우에 대한 쿼리를 지정하십시오. – zzlalani

+0

을 입력하고 레코드 셋에서 3 개의 결과 만 원합니까? 'IN (85,88,90)' – zzlalani

+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(); 

이 고유성을 보장하지 않습니다, 그러나 그것은 쉬운 솔루션입니다.

EDIT 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(); 
0

값의 제 4 (사이즈 내를 IN 절) idtag 발생 수는 85,85,85,90

erm 일 수 없으며, 거기에 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이 참인지 거짓인지에 따라 값을 제공합니다.

첫 번째 네 행에 나타나지 않는 두 값이 무엇을 의미하는지 이해하지 못합니다. 더 자세한 설명을 제공 할 수 있다면 (필자는 이것을 달성하려는 이유를 포함하여) 다음을 수행 할 수 있습니다. 좀 더 적절한 솔루션을 찾는다.

관련 문제