2013-10-04 62 views
1

讓我們假設我有以下的「產品」表:選擇查詢 - 每兩排爲單一結果行

ProductID | ProductName 
----------+--------- 
0255463 | ProductA  
0254483 | ProductB 
0255341 | ProductC 
0905454 | ProductD 

有沒有一種方法(在Android的SQLite的)來選擇每兩個連續的行成單結果行? 這裏是所希望的查詢結果:

FirstProductID | FirstProductName | SecondProductID | SecondProductName 
---------------+------------------+-----------------+--------- 
0255463  | ProductA   |  0254483 | ProductB 
0255341  | ProductC   |  0905454 | ProductD 

我想一個通用的解決方案,它可以用於任何表,而不管該表的內容。

+3

數據表示應該在應用程序(PHP)級別處理 –

+0

您是絕對正確的。 但是,我需要它爲一個Android應用程序(我使用他們的內置SqlLite),以便使用光標加載器。如果我想在一個ListView項目中獲得2個項目,這是唯一的解決方案,因爲Loader緊緊地綁定到列表適配器。換句話說:遊標是我可以用來填充android列表視圖的唯一輸入。 –

回答

3

創建一個自動遞增列

CREATE TEMP TABLE temp(
    id int not null primary auto increment, 
    pid int, 
    pname text,  
); 

插入一個臨時表中選擇這個數據到臨時表

INSERT INTO temp (pid, pname) SELECT * FROM Products; 

加入id = id + 1的臨時表,其中第一個實例有id % 2 = 0

SELECT t1.pid AS t1_pid, t1.pname AS t1_pname, 
    t2.pid AS t2_pid, t2.pname AS t2_pname 
FROM temp as t1 LEFT JOIN temp AS t2 
    ON t1.id + 1 = t2.id 
WHERE t1.id % 2 = 0; 
+1

+1好的解決方案!檢查一下建議的更改! –

+0

@LS_dev,感謝編輯,我沒有一個方便的mysql環境來嘗試。我不知道在教程中模擬瀏覽器中的mysql會話是否有任何商業價值。 –

+0

這個問題是關於[SQLite](http://www.sqlite.org),它有一個免費,輕鬆和輕量級的命令行shell。 –

0

這是很容易,如果你有行連續編號:

SELECT t1.productID AS productID1, t1.ProductName AS productName1, t2.productID AS productID2, t2.ProductName AS ProductName2 
FROM product t1 
JOIN product t2 WHERE t1.id+1 = t2.id 
WHERE MOD(t1.id,2) = 1 
ORDER BY t1.id 
0

這是樣品的想法,基本上我在做什麼是從2 SELECT語句中獲得不同的結果,並加入它,有它一試,歡呼=)

--sample表

DECLARE @SAMPLE TABLE 
(
ProductID INT, 
ProductName NVARCHAR(255) 
) 

--sample數據

INSERT INTO @SAMPLE 
VALUES 
('1','ProductA'), 
('2','ProductB'), 
('3','ProductC'), 
('4','ProductD') 

SELECT FirstProductID,FirstProductName,SecondProductID,SecondProductName FROM 
(

--query得到firstProduct它EMS

SELECT ROW_NUMBER() OVER (ORDER BY FirstProductID) firstrn,FirstProductID,FirstProductName 
FROM(
SELECT ProductID 'FirstProductID',ProductName 'FirstProductName' FROM 
(
SELECT ROW_NUMBER() OVER (Order by productid) firstrn1,ProductID,ProductName 
FROM @SAMPLE 
) FIRSTPRODUCTTABLE 
WHERE firstrn1%2 = 1 
) FIRSTPRODUCTTABLE1 
)t1 

-A聯接進行

LEFT OUTER JOIN (

--query獲得第二產品項目

SELECT * FROM 
(
SELECT ROW_NUMBER() OVER (ORDER BY SecondProductID) rownumber,SecondProductID,SecondProductName 
FROM(
SELECT ProductID 'SecondProductID',ProductName 'SecondProductName' FROM 
(
SELECT ROW_NUMBER() OVER (Order by productid) rn,ProductID,ProductName 
FROM @SAMPLE 
) SECONDPRODUCTTABLE 
WHERE rn%2 = 0 
)SECONDPRODUCTTABLE1 
) t2 
) t3 ON t1.firstrn=t3.rownumber 
+0

這不是[tag:SQLite]! –

0

在SQL這樣做,這將是相當複雜和緩慢的。

像這樣對列值進行重新排序的最簡潔的方法是實現自己的Cursor類,該類包裝原始數據庫遊標,但將列數加倍,並將所有列訪問重定向到適當的記錄。 事情是這樣的:

class DoubleColumnCursor implements Cursor { 
    Cursor baseCursor; 
    int baseColumns; 
    int currentPosition; 

    public getColumnCount() { 
     return baseColumns * 2; 
    } 
    public String getColumnName(int columnIndex) { 
     if (columnIndex < baseColumns) 
      return baseCursor.getColumnName(columnIndex) + "1"; 
     else 
      return baseCursor.getColumnName(columnIndex - baseColumns) + "2"; 
    } 
    public boolean moveToPosition(int position) { 
     boolean result = baseCursor.moveToPosition(position * 2); 
     if (result) 
      currentPosition = position; 
     return result; 
    } 
    public String getString(int columnIndex) { 
     if (columnIndex < baseColumns) { 
      baseCursor.moveToPosition(currentPosition * 2); 
      return baseCursor.getString(columnIndex); 
     } else { 
      baseCursor.moveToPosition(currentPosition * 2 + 1); 
      return baseCursor.getString(columnIndex - baseColumns); 
     } 
    } 
    ... 
}; 
1

單查詢(而不是更快):

SELECT 
    First.ProductId AS FirstProductId, 
    First.ProductName AS FirstProductName, 
    Second.ProductId AS SecondProductId, 
    Second.ProductName AS SecondProductName 
FROM 
    (SELECT *, Cnt/2 AS Line FROM (
     SELECT *, (
      SELECT COUNT() FROM Products AS _ WHERE ROWID<Products.ROWID 
     ) AS Cnt FROM Products WHERE Cnt%2=0 
    )) AS First 
LEFT JOIN 
    (SELECT *, Cnt/2 AS Line FROM (
     SELECT *, (
      SELECT COUNT() FROM Products AS _ WHERE ROWID<Products.ROWID 
     ) AS Cnt FROM Products WHERE Cnt%2=1 
    )) AS Second 
ON First.Line = Second.Line 
ORDER BY First.Line; 

如果你需要一個更快的解決方案,@kzarns提出了一個很好的一個。

相關問題