2013-10-24 114 views
0

具有結構如下表命名的書籍:Mysql的選擇順序

╔════════════╦═══════════╦════════╗ 
║ LibraryId ║ BookId ║ Price ║ 
╠════════════╬═══════════╬════════╣ 
║ 123  ║ 9001  ║ 10.99 ║ 
║ 123  ║ 9005  ║ 12.99 ║ 
║ 123  ║ 9006  ║ 7.99 ║ 
║ 124  ║ 8012  ║ 6.49 ║ 
║ 124  ║ 9001  ║ 3.19 ║ 
║ 124  ║ 9076  ║ 7.39 ║ 
╚════════════╩═══════════╩════════╝ 

我怎麼會做一個選擇,將返回完整的表,但另外一個名爲序,那場「罪狀」數每個圖書館的圖書。結果應該是這樣的:

╔════════════╦═══════════╦════════╦════════╗ 
║ LibraryId ║ BookId ║ Price ║Ordinal ║ 
╠════════════╬═══════════╬════════╬════════╣ 
║ 123  ║ 9001  ║ 10.99 ║  1 ║ 
║ 123  ║ 9005  ║ 12.99 ║  2 ║ 
║ 123  ║ 9006  ║ 7.99 ║  3 ║ 
║ 124  ║ 8012  ║ 6.49 ║  1 ║ 
║ 124  ║ 9001  ║ 3.19 ║  2 ║ 
║ 124  ║ 9076  ║ 7.39 ║  3 ║ 
╚════════════╩═══════════╩════════╝════════╝ 

我已經試過類似:

SET @var_record = 1; 
SELECT *, (@var_record := @var_record + 1) AS Ordinal 
FROM books; 

但是,這將繼續不論庫Id的計數。我需要一些能夠在libraryId每次改變時重置序數的東西。我更喜歡單個查詢而不是過程。


測試數據的SQL腳本:

create temporary table books(libraryId int, bookId int, price double(4,2)); 
insert into books (libraryId, bookId, price) values (123, 9001, 10.99),(123, 9005, 10.99),(123, 9006, 10.99),(124, 8001, 10.99),(124, 9001, 10.99),(124, 9076, 10.99); 
+0

USE聚合函數在這種情況下計數 – progrAmmar

回答

1

使用變量和條件,您可以重置基於條件的計數器(庫Id已經改變) 。必須由列libraryId命令。

SELECT books.*, 
    if(@libId = libraryId, 
     @var_record := @var_record + 1, 
     if(@var_record := 1 and @libId := libraryId, @var_record, @var_record) 
    ) AS Ordinal 
FROM books 
JOIN (SELECT @var_record := 0, @libId := 0) tmp 
ORDER BY libraryId; 

第二個if語句用於將兩個賦值分組在一起並返回@var_record。

if(@var_record := 1 and @libId := libraryId, @var_record, @var_record) 
+1

每當我看到這樣的MySQL解決方案時,我都爲那些不能使用具有真實視圖功能的數據庫的人流下了眼淚...... – user2864740

+0

這就是當架構部門害怕存儲過程像黑魔法時發生的情況...... –

+1

SP wouldn在這種情況下無助於基本查詢 - 這將是等同的或完全程序化的。問題在於MySQL缺乏表達這種乾淨的能力 - 而且必須「接受」這樣的限制,這讓我內心有點難過。 – user2864740

-3

也許你可以使用聚合函數

SELECT a.LibraryId, a.BookId, a.Price, 
     (SELECT COUNT(b.BookId) FROM books b WHERE b.BookId = a.BookId AND b.LibraryId = a.LibraryId) AS Ordinal 
FROM a.books 
+2

這將返回所有「序數」的1,1,1,1,1。即使它只是由LibraryId分組,它也會返回3,而不是我所問的。請認真思考問題,不要迅速回復,以便您首先發帖。 –

+0

我的不好,會有一個需要的子查詢。讓我改變我的答案。 – progrAmmar

+0

更正仍然無效。它計算所有按libraryId和bookId分組。這意味着對於我的示例中的數據,它將1,1,1,1,1,1作爲序號返回。 –