2016-08-11 5 views
0

私はこれに対する答えを探しましたが、適切な解決策を見つけられませんでした。私は1つのテーブル 'データ'を持つデータベースを持っています。ここでは、すべての製品の有効期限がリストされています。異なる製品の総数は約120点ですが、 'データ'表は5000行を超えています。すべての製品には、期限切れ監視のユニットが複数あります。複数の日付間の出現数をカウントし、MySQLのユニークな行だけをリストする方法は?

各年の有効期限の発生列を持つすべての固有商品をリストする必要があります。現在、私は2つの日付の間の有効期限の発生をカウントするためにメインクエリの反復の中で毎年複数の別のクエリを実行します。

CREATE TABLE IF NOT EXISTS `data` (
`EXPIRY` date DEFAULT NULL, 
`RNO` int(6) DEFAULT NULL, 
`PRODID` int(3) DEFAULT NULL, 
`NAME` varchar(38) DEFAULT NULL, 
`RND` varchar(2) DEFAULT NULL, 
`RDY` varchar(3) DEFAULT NULL, 
`ARTY` varchar(3) DEFAULT NULL, 
`ARYK` varchar(4) DEFAULT NULL, 
`BATCH` varchar(16) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

// list all unique product rows 
$main_loop = $database->query('SELECT * FROM data GROUP BY rno HAVING COUNT(*) >=1'); 
$rows = $database->resultset($main_loop); 
foreach($rows as $data) { 
    echo "<tr>"; 
    echo "<td>".$data['RNO']."</td>"; 
    <td> 
    // another query to count occurrences of expiry in each product between two dates 
    $thisrno = $data['RNO']; 
    $database->query("SELECT * FROM data WHERE EXP BETWEEN '2016-01-01' AND '2016-12-31' AND RNO = '$thisrno'"); 
    $database->execute(); 
    $rows = $database->rowCount(); 
    echo $rows; 
    echo "</td><td>"; 
    ...i would need to do this for each column (2016-2025) 
    ... 
} 

私はこれにはより良い解決策があると思います。問題はまた、この方法では、毎年満了するユニットの数でテーブルをソートすることができず、これはあまり効率的ではありません。

結果は次のようにする必要があります:

RNO | NAME  | Expiring in 2016 | Expiring in 2017 | ... 
336540 | Prod_name_1 | 34    | 62    | 
391755 | Prod_name_2 | 2    | 116    | 
653112 | Prod_name_3 | 46    | 7    | 

答えて

0

かなり簡単なようだ:

select rno, name, 
    sum(exp between '2016-01-01' and '2016-12-31') as exp2016, 
    sum(exp between '2017-01-01' and '2017-12-31') as exp2017, 
    sum(exp between '2018-01-01' and '2018-12-31') as exp2018, 
    sum(exp between '2019-01-01' and '2019-12-31') as exp2019, 
    sum(exp between '2020-01-01' and '2020-12-31') as exp2020, 
    sum(exp between '2021-01-01' and '2021-12-31') as exp2021, 
    sum(exp between '2022-01-01' and '2022-12-31') as exp2022, 
    sum(exp between '2023-01-01' and '2023-12-31') as exp2023, 
    sum(exp between '2024-01-01' and '2024-12-31') as exp2024, 
    sum(exp between '2025-01-01' and '2025-12-31') as exp2025 
from data 
where exp between '2016-01-01' and '2025-12-31' 
group by rno; 

あなたはそれらの年には有効期限を持っていなくても製品を含めたい場合は、where句を省略します。

あなたの質問は並べ替えについてはわかりません。あなたは1年を選択し、その年の有効期限までに行を並べ替えることができますが、それはちょっと変わったようです。

+0

多くのおかげで、私は完全にsum() - function ..を忘れてしまった。 – Sisuman

関連する問題