2013-01-15 4 views
2

is_thumbnail이라는 열이 있으며 기본값은 no입니다. 나는 행이 yes의 가치가 없다는 것을 기회가있다 is_thumbnail = 'yes'값이 no 인 경우 SELECT 기타

$query = $conn->prepare("SELECT * FROM project_data 
          WHERE project_id = :projectId 
          AND is_thumbnail = 'yes' 
          LIMIT 1"); 

의 기반으로 행을 선택합니다. 이 경우 projectId 값과 상관없이 동일한 projectId의 첫 번째 행을 선택하려고합니다.

이제 쿼리가 반환하는 것을 볼 수 있고 다른 쿼리를 실행할 수 있습니다. 이 질문을 단일 쿼리에서 수행 할 수 있는지 또는 PDO를 활용할 수 있는지 궁금합니다. 방금 PDO를 사용하기 시작했습니다. 감사!

예 데이터 : 예를 하나를 위해 존재하는 경우 질문에 설명 된 스키마가 좋은 성능을 얻을 수 없습니다 만 ORDER BY is_thumbnail ... 솔루션을 사용하여 주어진 project_id에 대한 여러 행을 보여줍니다 점을 감안

id project_id image        is_thumbnail 
20 2   50f5c7b5b8566_20120803_185833.jpg no 
19 2   50f5c7b2767d1_4link 048.jpg  no 
18 2   50f5c7af2fb22_4link 047.jpg  no 
+1

당신은'is_thumbnail'로 주문할 수 있습니다 – BevynQ

+0

샘플 데이터가 있습니까? – Kermit

+0

그러나 한 행만 반환하고 있습니다. 'is_thumbnail = 'yes''가 ​​포함 된 행이 없다면 0 행이 반환됩니다. – Ronnie

답변

3
$query = $conn->prepare("SELECT * FROM project_data 
          WHERE project_id = :projectId 
          ORDER BY is_thumbnail ASC LIMIT 1"); 
+0

+1 : 일단 질문에 답을 찾으면 이미 대답을 내놓았습니다. 하지만 처음에는 미리보기 이미지를 만드는 것이 더 간단하지 않습니까, Ronnie? – symcbean

+0

is_thumbnail이 yes라는 ​​사실을 무시하는 것처럼 보입니다. 나는 그것을 DESC 대신에 ASC로 바꾸었다. 지금은 작동 중이다. 감사합니다. – Ronnie

+0

@symcbean 그들 모두는 섬네일이며, 줄의 상태는 그 의미가 무엇인지 알면 전체 프로젝트의 미리보기 미리보기입니다. 나는 행이'is_preview' – Ronnie

1

많은 관련 행을 가진 프로젝트. 행을 정렬하는 비용은 상당히 높을 수 있으며 인덱스를 사용할 수 없습니다. 필요할 수 있습니다 대체 솔루션입니다 :이 솔루션은 좀 더 복잡한 이해하는 것입니다

SELECT * FROM (
    SELECT * 
    FROM project_data 
    WHERE project_id = :projectId AND is_thumbnail = "yes" 
    ORDER BY id DESC 
    LIMIT 1 

    UNION 

    SELECT * 
    FROM project_data 
    WHERE project_id = :projectId AND is_thumbnail = "no" 
    ORDER BY id DESC 
    LIMIT 1 
) AS t 
ORDER BY t.is_thumbnail = "yes" DESC 
LIMIT 1 

동안, 신속 요구 조건에 일치 정확히 하나의 행을 찾기 위해 (project_id, is_thumbnail, id)에 복합 인덱스를 사용 할 수 있습니다. 외부 선택은 예/아니요 행이 모두 발견되면 안정적인 순서를 유지합니다.

두 개의 쿼리를 발행 할 수도 있고 비슷하거나 더 나은 성능을 얻을 수도 있습니다. 위의 UNION과 sub-select를 사용하려면 MySQL에 바쁜 환경에서는 좋지 않은 임시 테이블이 필요합니다.

관련 문제