2012-12-26 35 views
24

Tôi có một bảng như thế này:MySQL Nhiều trường hợp quy định tại khoản

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 

Tôi muốn lấy cột image_id nếu:

  • style_id = 24style_value = red
  • style_id = 25style_value = big
  • style_id = 26style_value = round

Tôi có làm một truy vấn như thế này:

$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') 

Nhưng tôi không thể nhận được bất kỳ kết quả. Khi tôi làm mẫu này với OR, nó hoạt động tốt. Nhưng tôi phải làm điều này với AND. Bởi vì tôi cần id hình ảnh mà là cả hai "đỏ, lớn và trực tràng".

Tôi đã thực hiện rất nhiều tìm kiếm với Google nhưng không thể giải quyết bất kỳ giải pháp nào.

Xin cảm ơn,

Hãy làm việc tốt.

+0

Có bất kỳ sự phụ thuộc nào giữa style_id và style_value không? Đó là, style_id 24 có nghĩa là "màu đỏ", trong khi style_id 25 có nghĩa là "lớn"? – mdoyle

+0

Có, tôi có một bảng khác có tên là "kiểu". Và một phong cách có 5-6 tùy chọn khác nhau. Ví dụ: style_id 24 có 5 tùy chọn khác nhau (đỏ, lục, vàng, ...). –

+0

Bạn có thể cung cấp danh sách 'SHOW CREATE TABLE \ G' và' SHOW CREATE TABLE styles \ G', và cũng cung cấp một vài hàng mẫu từ bảng 'styles'? – mdoyle

Trả lời

0

Đây có thể là những gì bạn đang làm, mặc dù tùy thuộc vào số lượng style_id có, sẽ khó thực hiện (không chắc chắn các style_id có tĩnh hay không). Nếu đây là trường hợp, sau đó nó không phải là thực sự có thể những gì bạn đang muốn như là mệnh đề WHERE hoạt động trên cơ sở hàng để hàng.

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

+0

Tôi đã thử trong sqlfiddle, nhưng những giá trị này không tĩnh. Vì vậy, tôi phải chuyển đổi thành một phiên bản động. Nếu tôi không thể tìm thấy bất kỳ giải pháp thực tế nào, tôi có thể thử giải pháp của bạn. Cảm ơn Lock. –

6

Bạn sẽ không bao giờ có được một kết quả, đó là một lỗi logic đơn giản.

Bạn đang yêu cầu cơ sở dữ liệu trả lại hàng có style_id = 24 AND style_id = 25 AND style_id = 26. Vì 24 là không quá 25 và 26, bạn sẽ không nhận được kết quả nào.

Bạn phải sử dụng OR, sau đó điều đó có ý nghĩa.

+0

Nhưng, cũng có cả hai đang, image_id (45) => style_id (24), image_id (45) => style_id (25), image_id (45) => style_id (26) ... Nó có nghĩa là bảng có 3 hàng khác nhau với cùng một image_id. –

+0

Vì vậy, bạn cũng nên kiểm tra cùng một image_id. Tôi không hoàn toàn chắc chắn mục đích của SQL của bạn là gì. – akashivskyy

37

Tôi nghĩ rằng bạn là sau này:

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 

Bạn không thể sử dụng AND, bởi vì giá trị không thể 24 red25 big27 round cùng lúc trong cùng hàng, nhưng bạn cần phải kiểm tra sự hiện diện của style_id, style_value trong nhiều hàng, dưới cùng một image_id.

Trong truy vấn này tôi đang sử dụng IN (trong ví dụ cụ thể này, tương đương với OR) và tôi tính các hàng riêng biệt phù hợp. Nếu 3 hàng riêng biệt phù hợp, có nghĩa là tất cả 3 thuộc tính đều có mặt cho số image_id đó và truy vấn của tôi sẽ trả lại.

+0

Không bao giờ biết bạn có thể nhóm các mệnh đề như thế. Tiện lợi. – erich2k8

9
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' 
+0

cảm ơn. Đây là những gì tôi cần. Xong rôi. Có một công việc tốt đẹp. –

0
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 
+0

cảm ơn. Mã của bạn hoạt động rất tốt. Tôi chỉ xóa thông số "duy nhất" theo nhu cầu của tôi. Tất cả mọi thứ là okay ngay bây giờ. Cảm ơn một lần nữa và có một công việc tốt đẹp. –

0

Có thể sử dụng truy vấn này bạn không nhận được bất kỳ kết quả hoặc kết quả sản phẩm nào. Bạn cần sử dụng OR thay vì AND trong truy vấn của mình như dưới đây.

$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'); 

Hãy thử truy vấn này.

Các vấn đề liên quan