Интересно, как это может быть полезно, но я думаю, вы можете попробовать следующее:
SELECT t1.TextValue AS Text1,
t2.TextValue AS Text2
FROM tbl1 t1
LEFT JOIN tbl1 t2 ON ((t2.id - 4) = t1.id)
WHERE t1.id <= 4;
Контрольный пример:
CREATE TABLE tbl1 (id int, textvalue varchar(15));
INSERT INTO tbl1 VALUES(1, 'Apple');
INSERT INTO tbl1 VALUES(2, 'Mango');
INSERT INTO tbl1 VALUES(3, 'Orange');
INSERT INTO tbl1 VALUES(4, 'Pineapple');
INSERT INTO tbl1 VALUES(5, 'Banana');
INSERT INTO tbl1 VALUES(6, 'Grapes');
INSERT INTO tbl1 VALUES(7, 'Sapota');
Результат:
+-----------+--------+
| Text1 | Text2 |
+-----------+--------+
| Apple | Banana |
| Mango | Grapes |
| Orange | Sapota |
| Pineapple | NULL |
+-----------+--------+
UPDATE:
Как @ AlexCuse , предложенный в комментарии ниже, вы также можете использовать переменную для получения количества строк в таблице, чтобы иметь запрос, который работает для любого числа строк:
DECLARE @x float;
SET @x = ROUND((SELECT COUNT(*) FROM tbl1) / 2.0, 0);
SELECT t1.TextValue AS Text1,
t2.TextValue AS Text2
FROM tbl1 t1
LEFT JOIN tbl1 t2 ON ((t2.id - @x) = t1.id)
WHERE t1.id <= @x;