2012-04-11 2 views
0

내가MySQL은 "기본"결과

SELECT id, text 
FROM table 
WHERE category = [category id] AND active = 1 
ORDER BY RAND() 
LIMIT 1 

일부 시간이 임의의 선을 선택

id | text | category | active 

같은 MySQL의 테이블이 어떤 결과를 반환하지 않을 것이다있다 (활성 행의가 없다 예를 들어, 경우 특정 카테고리). 이 경우에해야 할 일은 "기본"행을 반환하는 것입니다.

내 질문은 :이 작업을 수행하는 가장 효율적인 방법은 무엇입니까? 동일한 테이블을 작성해야하지만 위의 쿼리가 결과를 제공하지 않으면 쿼리 할 기본 행만 사용해야합니까? 또는 동일한 테이블에 기본 행을 추가해야합니까? 그리고 당신은 그것을 어떻게 질문 할 것입니까?

모든 의견을 환영합니다! 질문에

편집 몇 업데이트 :

  1. 나는 그것이 사용자 정의 할 수 원하는대로 내가 가서 변경하지 않고, PHP의 기본 텍스트를 생성의 가능성을 제외하고 오전 암호.

답변

2

원하는 기본값은 무엇입니까? 테이블의 첫 번째 ID는?

SELECT id, text 
FROM ( SELECT id, categori, active, text, 0 AS prio 
     FROM table WHERE category = [category id] AND active = 1 AND default = 'FALSE' 
     UNION ALL 
     SELECT id, categori, active, text, 1 
     FROM table 
     WHERE category = [category id] AND default = 'TRUE' 
     ORDER BY id ASC 
     LIMIT 1) AS h 
ORDER BY prio, RAND() 
LIMIT 1 

쉬운 일 :

SELECT id, text 
FROM table 
WHERE category = [category id] AND (active = 1 OR default = 'TRUE') 
ORDER BY (default = 'FALSE') DESC, RAND() 
LIMIT 1 

설명 :
Basicly이 당신이 특정 디폴트 값을 원하는 경우

SELECT id, text 
FROM ( SELECT id, categori, active, text, 0 AS prio 
     FROM table WHERE category = [category id] AND active = 1 
     UNION ALL 
     SELECT id, categori, active, text, 1 
     FROM table 
     ORDER BY id ASC 
     LIMIT 1) AS h 
ORDER BY prio, RAND() 
LIMIT 1 

하는 ENUM 컬럼은 default('TRUE', 'FALSE')라는 추가 쿼리는 t에서 계산 한 모든 행을 가져옵니다. o 기본 행을 가져 와서 결합하십시오. 그들은 각각 prio 값을 얻었고 RAND()을하기 전에 주문했습니다. 남은 것은 기본 행을 저장하는 방법입니다.

+0

음, 이것이 내가 원하는 부분으로가는 것 같습니다. – nico

+0

나는 약간의 설명도 추가했습니다. 더 많은 예제가 필요한 경우 알려주십시오. –

+0

나는 몇 가지 검사를 할 것입니다. 고마워요! – nico

0

어떻게 당신이 "기본 행"을 의미합니까 카테고리 당 기본 행이 될 것인가? 나는 당신이 의미하는 것을 얻을 지 정말로 확신하지 못합니다. 그러나 아무 결과가 없더라도 어쨌든 결과를 출력하고 싶다고 말하면 프로그래밍 방식으로 처리 할 것입니다.

결과가 데이터로 설정되어 있는지 확인하고 그렇지 않은 경우 스크립트를 통해 결과를 출력하십시오.

+0

질문에 해당 의견을 추가했습니다. – nico

0

당신이 사용중인 언어에 따라, 당신은 단지 반환 된 행 수를 볼 수 있습니다 :

// php 

$res = mysql_query("..."); 

if(mysql_num_rows($res) < 1) 
{ 
    // no result 
} 
else 
{ 
    // do something 
} 
+0

질문의 마지막 문장을 참조하십시오. 기본 결과를 사용자 정의 할 수 있어야합니다. – nico

3
SELECT id, text 
FROM table 
WHERE (category = [category id] AND active = 1) 
    OR ((DEFAULT CONDITION) AND NOT((category = [category id] AND active = 1))) 
ORDER BY RAND() 
LIMIT 1 
+0

첫 번째 조건이 충족되지 않은 경우뿐만 아니라 무작위로 기본값을 그릴 수 없습니까? –

+0

이 쿼리를 이해할 수 있는지 확실하지 않습니다 ... 기본 조건이 없으며 기본 결과가 있습니다. 내가 놓친 게 있니? – nico

+0

'DEFAULT CONDITION' 리터럴을 사용하지 마십시오. 예를 들어 기본 행을 가져 오는 일정 조건으로 행을 필터링 할 수 있습니다. –