2012-09-26 3 views
0

은 현재 진행중인 버전입니다.MySQL : MIN() 및 MAX() 쿼리를 결합 할 수 있습니까?

A)

SELECT id, foreign_key_id, type, quantity, MAX(price) AS price // <--- Max 
FROM quotes 
WHERE type = 'tier 1'           // <--- Equal 
AND prod_id_requested = 12345 

B)

SELECT id, foreign_key_id, type, quantity, MAX(price) AS price // <--- Max 
FROM quotes 
WHERE type != 'tier 1'           // <--- NOT equal 
AND prod_id_requested = 12345 

C)

SELECT id, foreign_key_id, type, quantity, MIN(price) AS price // <--- Min 
FROM quotes 
WHERE type = 'tier 1'           // <--- Equal 
AND prod_id_requested = 12345 

D)

SELECT id, foreign_key_id, type, quantity, MIN(price) AS price // <--- Min 
FROM quotes 
WHERE type != 'tier 1'           // <--- NOT equal 
AND prod_id_requested = 12345 

일부 자원을 절약하고 더 적은 수의 검색어로 결합 할 수있는 좋은 방법이 있습니까?
아니면이 방법이 그 방법입니까?


여기에 재생 일부 샘플 데이터의 [이 UPDATE] : 궁극적으로

CREATE TABLE IF NOT EXISTS `quote_item` (
    `id` int(2) unsigned NOT NULL AUTO_INCREMENT, 
    `quote_id` int(2) unsigned NOT NULL, 
    `product_id_quoted` int(3) unsigned NOT NULL, 
    `product_id_requested` int(3) unsigned NOT NULL, 
    `type` varchar(52) DEFAULT NULL, 
    `price` float(10,4) NOT NULL, 
    `quantity` int(9) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `quote_item` (`id`, `quote_id`, `product_id_quoted`, `product_id_requested`, `type`, `price`, `quantity`) VALUES 
(1, 1, 12, 12, 'tier 1', 0.0100, 100), 
(2, 2, 1, 12, 'tier 3', 0.0038, 8200), 
(3, 2, 13, 12, 'tier 2', 0.0041, 10000), 
(4, 3, 7, 14, 'tier 1', 0.0060, 25000), 
(5, 3, 8, 12, NULL, 0.0180, 250), 
(6, 3, 9, 15, NULL, 0.0019, 5000), 
(7, 4, 12, 12, NULL, 0.0088, 7500), 
(8, 4, 16, 12, 'tier 1', 0.0040, 10000), 
(9, 5, 12, 9, 'tier 2', 0.0089, 1200), 
(10, 5, 12, 12, 'tier 1', 0.0072, 6400); 

, 우리는 잘 배열로 모든 데이터를 포장하고 싶다. 우리가 실제 ID, 수량,
현재, 우리는 각 쿼리에서 행을 받고있다 (어떤 그룹 없음) 등
... 최소 값으로 단일 행뿐만 아니라 같은 정보를 원하시면 최대 가격을 가진 단일 행의 "유형"범주에 대해 배열을 작성하십시오. 예를 들어
:

$flash_report = array(
    'tier1' => array(
     'qty' => array(
      'min' => array(
       'id' => 1 
       ,'quote_id' => 1 
       ,'price' => 0.01 
       ,'quantity' => 100 
       ) 
      ,'max' => array(
       'id' => 8 
       ,'quote_id' => 4 
       ,'price' => 0.004 
       ,'quantity' => 10000 
       ) 
      ,'sum' => array(
       'value' => 16500 
       ,'count' => 3 
       ) 
     ) 
     ,'price' => array(
      'min' => array(
       'id' => 8 
       ,'quote_id' => 4 
       ,'price' => 0.004 
       ,'quantity' => 10000 
       ) 
      ,'max' => array(
       'id' => 1 
       ,'quote_id' => 1 
       ,'price' => 0.01 
       ,'quantity' => 100 
       ) 
     ) 
    ) 
    ,'other' => array(
     'qty' => array(
      'min' => array(
       'id' => 5 
       ,'quote_id' => 3 
       ,'price' => 0.018 
       ,'quantity' => 250 
       ) 
      ,'max' => array(
       'id' => 3 
       ,'quote_id' => 2 
       ,'price' => 0.0041 
       ,'quantity' => 10000 
       ) 
      ,'sum' => array(
       'value' => 25950 
       ,'count' => 4 
       ) 
     ) 
     ,'price' => array(
      'min' => array(
       'id' => 2 
       ,'quote_id' => 2 
       ,'price' => 0.0038 
       ,'quantity' => 8200 
       ) 
      ,'max' => array(
       'id' => 5 
       ,'quote_id' => 3 
       ,'price' => 0.018 
       ,'quantity' => 250 
       ) 
     ) 
    ) 
) 

[/UPDATE]

지금, 그때 큰 올 '배열로 모든 조립, 우리의 개별 쿼리에서 모든 데이터를 얻고있다. 내가 생각하고
이이 :) 할 수있는 더 좋은 방법이 될 수있어 거기에

+1

질의가 단순화되거나 난해 해지 겠지만 나 같은 사람들은 [MySQL의 GROUP BY 지원] (http://dev.mysql.com/)으로 인해 결과가 임의로 발생할 수 있다는 것을 의미하는 'GROUP BY'부족에 중점을 둘 것입니다. doc/refman/5.0/ko/group-by-hidden-columns.html). –

+0

@ omg-ponies 감사합니다.질문은 이제 더 많은 정보로 업데이트되어 내가 성취하고자하는 것을 명확하게 설명합니다. – mOrloff

+0

BTW, 원하는 결과를 배열로 넣습니다. 데이터를 pkg 할 계획이기 때문에뿐만 아니라 이해하기가 가장 쉽다고 생각하기 때문에 (대부분) 그렇게합니다. ... 나는 다른 사람들에게도 그렇게되기를 바랍니다 :) – mOrloff

답변

2
SELECT id, foreign_key_id, type, quantity, 
    MIN(case when type != 'tier 1' then price end) as MinNotTier1Price, 
    MIN(case when type == 'tier 1' then price end) as MinTier1Price, 
    MAX(case when type != 'tier 1' then price end) as MaxNotTier1Price, 
    MAX(case when type == 'tier 1' then price end) as MaxTier1Price 
FROM quotes 
+0

샘플 데이터와 원하는 출력을 제공하십시오. – RedFilter

+0

감사합니다. 해당 정보로 질문이 업데이트되었습니다. – mOrloff

1
SELECT id, 
     foreign_key_id, 
     type, 
     quantity, 
     MAX(case when type = 'tier 1' then price else NULL end) AS price_max_eq, 
     MIN(case when type = 'tier 1' then price else NULL end) AS price_min_eq, 
     MAX(case when type <> 'tier 1' then price else NULL end) AS price_max_neq, 
     MIN(case when type <> 'tier 1' then price else NULL end) AS price_min_neq, 
FROM quotes 
0

당신은 적어도 그렇게

처럼 A와 C뿐만 아니라 B와 D를 결합 할 수 있습니다
SELECT id, 
     foreign_key_id, 
     type, 
     quantity, 
     MAX(price) AS max_price, 
     MIN(price) AS min_price 
FROM quotes 
WHERE type = 'tier 1' 
GROUP BY id, foreign_key_id, type, quantity 


SELECT id, 
     foreign_key_id, 
     type, 
     quantity, 
     MAX(price) AS max_price, 
     MIN(price) AS min_price 
FROM quotes 
WHERE type != 'tier 1' 
GROUP BY id, foreign_key_id, type, quantity 
3

당신은 모든 것을 결합 할 수 있습니다 :

SELECT "equal" as condition, 
     MAX(price) AS max_price, 
     MIN(price) AS min_price 
    FROM quotes 
WHERE type = 'tier 1' 
GROUP BY 1 
UNION 
SELECT "not_equal" as condition, 
     MAX(price) as max_price, 
     MIN(price) as min_price 
    FROM quotes 
WHERE type != "tier 1" 
GROUP BY 1 
0123을

나는 CASE 솔루션보다 더 낫다. (비록 더 간결하지만) SQL92를 완벽하게 준수하고 있기 때문이다.

id, foreign_key 및 qty 필드를 제거했습니다. 키에 그룹화 된 그룹을 의도하지 않았고 그 그룹을 수량으로 그룹화하려는 이유가 궁금했기 때문입니다.

+0

이 질문에 유래 stackoverflow.com 의해 답변을 얻으려면이 시점에서 네 가지 개별 값 "min_notequal", "min_equal", "조건"(내 대답) max_notequal, "max_equal". –

관련 문제