2012-08-30 2 views
1

클라이언트에 대한 간단한 URL 회전기를 작성 중이며 이전에 표시된 가장 오래된 URL에 따라 URL을 회전 시키길 원합니다.하나의 열이 최소 인 행을 선택하십시오.

url_id | company_id | url | last_clicked 

내가 company_id가 전달되는 단일 행을 인출 할과 last_clicked는 company_id 일치하는 모든 레코드의 최소 :

내 열은 매우 간단합니다.

모든 last_clicked 값이 비어 있으면 임의의 url_id도 선택해야합니다.

GROUP BYHAVING으로 수행 할 수 있다고 가정하지만 아무 것도 반환하지 않을 수 있습니다.

SELECT url_id FROM urls 
    WHERE company_id = $company 
    ORDER BY last_clicked, RANDOM() LIMIT 1; 

인덱스 company_id에 기초 :

$last = $this->db->fetchOne ("SELECT url_id FROM 
     {$this->prefix}urls GROUP BY company_id HAVING MIN(last_clicked) 
     WHERE company_id='$company'"); 
+0

당신은 [SQL 탈출] (http://bobby-tables.com/php)을하고 있습니까? 아니면이 값들이 완전히 안전하기를 바랍니까? – tadman

+0

그것은 모두 db 클래스에서 이스케이프 처리됩니다 .-) –

+0

'?'또는': company'와 같은 자리 표시자를 실제로 사용해야하므로 이스케이프 처리에 대한 의문의 여지가 없습니다. 우연히 이들 중 하나를 놓친 경우 [자동 취약점 테스트 도구] (http://sqlmap.org/)를 사용하여 크게 열 수 있습니다. 문자열 보간은 본질적으로 위험합니다. – tadman

답변

0

이 그들이 모두 NULL 경우 최소, 또는 무작위로 last_clicked있는 행을 가져옵니다 :

나는이 있습니다 last_clicked은 크게 도움이됩니다.

+0

두 열은 이미 색인되어 있습니다. 이것은 RANDOM() LIMIT 1을 RANDOM() LIMIT 0,1으로 변경 한 것 이외에는 완벽했습니다. 차이가 있는지는 모르지만 현재 시간을 업데이트하기 위해 쿼리를 추가하면 완벽하게 작동합니다. 모든 링크가 정확한 위치에 나타납니다. 매번 올바른 순서. 감사합니다 :) –

-1
SELECT url_id FROM 
TABLE 
WHERE company_id='$company' 
AND last_clicked = (SELECT MIN(last_clicked) 
         FROM TABLE WHERE company_id='$company') 
관련 문제