2013-10-04 4 views
1

Давайте предположим, что у меня есть следующий «продуктов» стол:выберите запрос - каждый две строки в единый результат строки

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

Есть ли способ (в SQLite Android), чтобы выбрать каждый из двух последовательных строк в одной строку результата ? Здесь желаемый результат запроса:

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

Я хотел бы общее решение, которое может быть использовано для любой таблицы, независимо от содержимого таблицы.

+3

Представление данных должно обрабатываться на уровне приложения (PHP) –

+0

Вы абсолютно правы. Однако мне нужно приложение для Android (я использую их встроенный SqlLite), чтобы использовать Cursor Loader.В случае, если я хотел бы получить 2 элемента в одном элементе ListView, это единственное решение, так как Loader тесно связан с адаптером списка. другими словами: курсор его единственный вход, который я могу использовать, чтобы заполнить вид списка андроидов. –

ответ

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), который имеет свободную, легкую и легкую оболочку командной строки. –

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 оператора выбора и присоединиться к нему, чтобы попробовать на нем, развеселить =)

--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 его Эмс

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 предложил хороший.

Смежные вопросы