복붙노트

[SQL] MySQL의 여러 Where 절

SQL

MySQL의 여러 Where 절

나는이 같은 테이블이 있습니다 :

id  image_id  style_id  style_value
-----------------------------------
1   45        24        red
1   45        25        big
1   47        26        small
1   45        27        round
1   49        28        rect

나는 경우 image_id 열을 먹고 싶어 :

나는이 같은 쿼리을 가지고 :

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') AND (style_id = 25 AND style_value = 'big') AND (style_id = 27 AND style_value = 'round')

하지만 어떤 결과를 가져올 수 없습니다. 내가 또는이 샘플을 만들 때 잘 작동합니다. 그러나 나는이 작업을 수행해야합니다. 난 둘 다 ", 크고 RECT 빨간색"하는 이미지 아이디의 필요 때문입니다.

나는 구글과 검색을 많이 만든 그러나 어떤 해결책을 찾을 수 없습니다.

해결법

  1. ==============================

    1.난 당신이 후라고 생각 :

    난 당신이 후라고 생각 :

    SELECT image_id
    FROM list
    WHERE (style_id, style_value) IN ((24,'red'),(25,'big'),(27,'round'))
    GROUP BY image_id
    HAVING count(distinct style_id, style_value)=3
    

    당신은 사용할 수 없으며, 값은 빨강 (24) 큰 (25)과 같은 행에 같은 시간에 27 라운드를 할 수 없기 때문에,하지만 당신은 같은 image_id에서, style_id, 여러 행에 style_value의 존재를 확인해야합니다.

    이 쿼리에서 나는 IN (즉,이 특정 예에서, OR에 해당) 사용하고, 나는 일치하는 별개의 행을 계산하고있다. 3 개 별개의 행이 일치하는 경우, 모든 3 개 속성이 그 image_id에 존재하는 것을 의미하며, 내 쿼리를 반환합니다.

  2. ==============================

    2.

    SELECT a.image_id 
    FROM list a
    INNER JOIN list b
       ON a.image_id = b.image_id
       AND b.style_id = 25
       AND b.style_value = 'big'
    INNER JOIN list c
       ON a.image_id = c.image_id
       AND c.style_id = 27
       AND c.style_value = 'round'
    WHERE a.style_id = 24 
       AND a.style_value = 'red'
    
  3. ==============================

    3.당신은 결과를 얻을하지 않습니다, 그것은 단순한 논리 오류입니다.

    당신은 결과를 얻을하지 않습니다, 그것은 단순한 논리 오류입니다.

    당신은 24 년 이후 = 24 AND style_id = 25 AND style_id = 26 style_id 한 행을 반환하는 데이터베이스를 요구하고 25 개의도 (26), 더 결과를 얻을 것 niether입니다.

    당신은 다음 몇 가지 의미가 있습니다, 사용해야 OR.

  4. ==============================

    4.이것은 당신이 style_id의가있다, 구현하기 까다로운 일이 될 것입니다 얼마나 많은에 따라 있지만, 이후에 무슨 수 있습니다 (하지 않도록 그 style_id 년대는 정적 또는하지 않은 경우). 이 경우, 당신이 절은 행 기준에 행에서 작동 WHERE으로 원하는 무엇을 정말 수 없습니다.

    이것은 당신이 style_id의가있다, 구현하기 까다로운 일이 될 것입니다 얼마나 많은에 따라 있지만, 이후에 무슨 수 있습니다 (하지 않도록 그 style_id 년대는 정적 또는하지 않은 경우). 이 경우, 당신이 절은 행 기준에 행에서 작동 WHERE으로 원하는 무엇을 정말 수 없습니다.

    WITH cte as (
      SELECT
        image_id,
        max(decode(style_id,24,style_value)) AS style_colour,
        max(decode(style_id,25,style_value)) AS style_size,
        max(decode(style_id,27,style_value)) AS style_shape
      FROM
        list
      GROUP BY
        image_id
    )
    SELECT
      image_id
    FROM
      cte
    WHERE
      style_colour = 'red'
      and style_size = 'big'
      and style_shape = 'round'
    

    http://sqlfiddle.com/#!4/fa5cf/18

  5. ==============================

    5.

    select unique red24.image_id from 
    ( 
        select image_id from `list` where style_id = 24 and style_value = 'red' 
    ) red24
    inner join 
    ( 
        select image_id from `list` where style_id = 25 and style_value = 'big' 
    ) big25
    on red24.image_id = big25.image_id
    inner join 
    ( 
        select image_id from `list` where style_id = 27 and style_value = 'round' 
    ) round27
    on red24.image_id = round27.image_id
    
  6. ==============================

    6.이 쿼리를 사용하고있을 수 있습니다 당신은 어떤 결과 또는 빈 결과를 얻을 수 없습니다. 당신은 대신 아래처럼 쿼리 또는 사용할 필요가있다.

    이 쿼리를 사용하고있을 수 있습니다 당신은 어떤 결과 또는 빈 결과를 얻을 수 없습니다. 당신은 대신 아래처럼 쿼리 또는 사용할 필요가있다.

    $query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') OR (style_id = 25 AND style_value = 'big') OR (style_id = 27 AND style_value = 'round');
    

    이 쿼리를 사용해보십시오.

  7. from https://stackoverflow.com/questions/14046637/mysql-multiple-where-clause by cc-by-sa and MIT license