2015-03-02 24 views
2

我在MySQL表格中有一些數據,我試圖將當前年份值和過去一年的數據進行比較。如何比較表中的數據與當前年份和即將過去的年份

Books 
| id | Name | 
| 01 | Maths | 
| 02 | English | 

BooksTable 
| Books | value | Year | 
| 01 | 40  | 2012 | 
| 02 | 30  | 2012 | 
| 02 | 50  | 2013 | 
| 01 | 50  | 2013 | 
| 01 | 60  | 2014 | 

我想要一個優化,更好的方式通過PHP比較在今年(2013年和2014年)的圖書的價值,並能輸出成一個HTML表格。 這是我希望它出現在HTML表格

HTML TABLE 
| BOOKS | 2013 | 2014 | 
| Maths | 50  | 60  | 
| English| 50  | -  | 

這是我做過什麼:

  1. 我第一次查詢的數據僅爲2013
  2. ,然後查詢數據只2014
  3. 我提出的2014年相比,while語句

的錯誤我 個1.所有查詢運行空,如果2014年的查詢返回空,因爲輸出爲2013查詢依賴2014年查詢

UPDATE 請這就是我試圖

//query for the year 2013 
SELECT 
    a.id, 
    a.name, 
    b.books, 
    b.value 
FROM 
    BOOKS a 
JOIN 
    BooksTable b 
ON 
    a.id=b.books 
WHERE 
    year=2013 


//query for the year 2014 
SELECT 
    a.id, 
    a.name, 
    b.books, 
    b.value 
FROM 
    BOOKS a 
JOIN 
    BooksTable b 
ON 
    a.id=b.books 
WHERE 
    year=2014 

請,我知道我做錯了什麼,有沒有一個優化和更好的方法呢?如果有人能提供幫助,我將不勝感激。謝謝。

+0

什麼ü試圖到目前爲止解決呢? – 2015-03-02 07:50:55

+0

而你只有3年? – 2015-03-02 07:53:21

+0

這些年可能更多,但爲了更好地理解,我僅使用了3年 – George 2015-03-02 07:54:48

回答

1

在我自己的方式,這是我將如何與PHP和MySQL

SELECT 
     a.id, 
     a.name, 
     b.books, 
     IFNULL(NULL,'0') AS currentValue, 
     IFNULL(b.value,0) as PastValue 
    FROM 
     `Books` a 
    JOIN 
     `BooksTable` b 
    ON 
     a.id=b.id 
      and 
     Year='2013' 

UNION ALL 

    SELECT 
     a.id, 
     a.name, 
     b.books, 
     IFNULL(b.value,0) as currentValue, 
     IFNULL(NULL,0) as PastValue 

    FROM 
     `Books` a 
    JOIN 
     `BooksTable` b 
    ON 
     a.id=b.id 
      and 
     Year='2014' 
0

Mysql沒有生成數據透視表的函數,即將行值顯示爲列。您可以使用動態SQL查詢和準備好的語句來執行此操作。

這裏有很多教程(mysql顯示行數據作爲列)。 在你的情況下,以下應該可以完成這項工作。

set @sql = null; 
select 
    group_concat(distinct 
    concat(
     'sum(case when bt.Year = ''', 
     Year, 
     ''' THEN bt.value ELSE 0 END) AS ', 
     CONCAT('`',Year, '`') 
    ) 
) into @sql 
from BooksTable ; 

SET @sql = concat('SELECT b.Name, 
          ', @sql, 
        'FROM  Books b 
          INNER JOIN BooksTable bt 
           ON b.id = bt.Books 
        GROUP BY b.Name'); 

prepare stmt from @sql; 
execute stmt; 
deallocate prepare stmt; 
+0

輸出是html,所以在這裏不需要mysql數據透視表。 PHP可以完成這項工作。 – Strawberry 2015-03-02 08:40:04

1

您可以使用下列內容:

SELECT b.Name, IFNULL(bt1.value, '-') as PastYear, IFNULL(bt2.value, '-') as CurrentYear 
FROM Books b 
LEFT JOIN BooksTable bt1 ON b.id=bt1.Books AND bt1.Year = (SELECT bt1y.Year FROM BooksTable bt1y GROUP BY bt1y.Year ORDER BY bt1y.Year DESC LIMIT 1,1) 
LEFT JOIN BooksTable bt2 ON b.id=bt2.Books AND bt2.Year = (SELECT bt2y.Year FROM BooksTable bt2y GROUP BY bt2y.Year ORDER BY bt2y.Year DESC LIMIT 0,1) 

那將要顯示在HTML中以同樣的方式返回數據,所以只是循環一次:

output

+0

這些年可能更像2015年和2014年,它不應該只是2013年和2014年。我用這個來最好地闡明我想要的東西。 – George 2015-03-02 08:44:04

+0

@George Okey然後,不需要downvote,我只是說如果是這樣的話。無論如何,你總是想要過去的兩年,還是全年? – Pinx0 2015-03-02 08:55:20

+0

@George現在就來看看吧。 – Pinx0 2015-03-02 09:09:38

0

您可以試試這個伴侶:

DROP PROCEDURE IF EXISTS sp_calc_books; 
DELIMITER // 
CREATE PROCEDURE sp_calc_books (IN in_year INTEGER(4), OUT out_value  INTEGER(11)) 
BEGIN 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
     ROLLBACK; 
    END; 
    START TRANSACTION; 
     SET @min_year = 0; 

     SELECT MIN(year) INTO @min_year FROM bookstable; 

     SELECT SUM(b.value) INTO out_value FROM books b 
     JOIN bookstable bt ON bt.book = b.id 
     WHERE bt.year BETWEEN @min_year AND in_year; 
COMMIT; 
END// 
DELIMITER ; 

然後,你可以把它叫做直通:

CALL sp_calc_books(2014, @output_var); 
SELECT @output_var; 
1

我只是執行簡單的查詢可能,在PHP處理顯示問題(未顯示)。

DROP TABLE IF EXISTS Books; 

CREATE TABLE books 
(book_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,Name VARCHAR(12) NOT NULL 
); 
INSERT INTO books VALUES 
(01 ,'Maths'), 
(02 ,'English'); 

DROP TABLE IF EXISTS book_values; 

CREATE TABLE book_values 
(book_id INT NOT NULL 
,value INT NOT NULL 
,Year INT NOT NULL 
,PRIMARY KEY(book_id,year) 
); 

INSERT INTO book_values 
VALUES 
(01 ,40  ,2012 ), 
(02 ,30  ,2012 ), 
(02 ,50  ,2013 ), 
(01 ,50  ,2013 ), 
(01 ,60  ,2014 ); 

SELECT b.*,v.value,v.year FROM books b JOIN book_values v ON v.book_id = b.book_id WHERE v.year IN (2013,2014); 
+---------+---------+-------+------+ 
| book_id | Name | value | year | 
+---------+---------+-------+------+ 
|  1 | Maths | 50 | 2013 | 
|  1 | Maths | 60 | 2014 | 
|  2 | English | 50 | 2013 | 
+---------+---------+-------+------+ 

編輯:我不是在PHP或在其操作數組,但這樣的事情太大了......

<?php 

include('path/to/connection/statem.ent'); 

$query = " 
SELECT b.* 
    , v.value 
    , v.year 
    FROM books b 
    JOIN book_values v 
    ON v.book_id = b.book_id 
WHERE v.year IN (2013,2014) 
ORDER 
    BY b.book_id 
    , v.year;"; 

$old_array = array(); 

$result = mysqli_query($db,$query); 

while($row = mysqli_fetch_assoc($result)){ 
$old_array[] = $row; 
} 

$new_array = Array(); 

foreach($old_array as $v) 
{ 
    if(!isset($new_array[$v["Name"]][$v["year"]])) 
    { 
     $new_array[$v["Name"]][$v["year"]] = 0; 
    } 
    $new_array[$v["Name"]][$v["year"]] += $v["value"]; 
} 
print_r($new_array); 

?> 

...會產生這樣的數組...

Array 
(
    [Maths] => Array 
     (
      [2013] => 50 
      [2014] => 60 
     ) 

    [English] => Array 
     (
      [2013] => 50 
     ) 

) 

希望你能弄清楚如何吐出html表格。

+0

這很酷很簡單,但你會如何比較它們。 – George 2015-03-02 10:13:58

+0

因此,請參閱上面的編輯。 – Strawberry 2015-03-02 14:34:23

相關問題