2013-09-06 3 views
-2

У меня есть таблица (MySQL) с ~ 35.000.000 строк, и мне нужно получить все данные по порядку по id.Мне нужно получить все данные id по строкам в MySQL

Таблица: Данные

+--+-----+-----+ 
|id|field|value| 
+--+-----+-----+ 
|1 | x | 10 | 
+--+-----+-----+ 
|1 | y | 12 | 
+--+-----+-----+ 
|2 | x | 24 | 
+--+-----+-----+ 
|2 | y | 25 | 
+--+-----+-----+ 
|3 | z | 1 | 
+--+-----+-----+ 
|3 | a | 4 | 
+--+-----+-----+ 
|3 | b | 7.1 | 
+--+-----+-----+ 

мне нужно получить:

+--+--+----+ 
|10|12|NULL| <--- ID:1 
+--+--+----+ 
|24|25|NULL| <--- ID:2 
+--+--+----+ 
|1 | 4|7.1 | <--- ID:3 
+--+--+----+ 

Мой запрос:

SELECT 
(
    SELECT 
     value 
    FROM 
     data 
    WHERE 
     EXISTS(
      SELECT 
       1 
      FROM 
       members 
      WHERE 
       data.id = members.id 
      LIMIT 1 
     ) 
) 

Мой результат:

#1241 - Operand should contain 1 column(s) 

Любая идея, как это сделать, только MySQL и эффективно?

+1

Как ваш запрос относится к желаемым результатам? Желаемые результаты состоят из трех столбцов, но ваш запрос состоит только из двух. Все желаемые результаты выглядят из столбца 'value', но ваш запрос имеет значение' field' и 'value'. –

+0

Я не верю, что это все - выберите из выбора ... просто так. – jaczes

+1

Всегда ли до трех строк на идентификатор? – peterm

ответ

1

Чтобы получить желаемый результат, как вы изложив его в вашем вопросе (значения в отдельных столбцах), вы можете использовать запрос, как этот

SELECT r.id, 
     MAX(CASE WHEN r.rnum = 1 THEN value END) value1, 
     MAX(CASE WHEN r.rnum = 2 THEN value END) value2, 
     MAX(CASE WHEN r.rnum = 3 THEN value END) value3 
    FROM 
(
    SELECT id, rnum 
    FROM 
    (
    SELECT DISTINCT id 
     FROM runnerdata 
) d CROSS JOIN 
    (
    SELECT 1 rnum UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 
) n 
) r LEFT JOIN 
(
    SELECT id, value, @n := IF(@g = id, @n + 1, 1) rnum, @g := id 
    FROM runnerdata 
    ORDER BY id, data 
) q ON r.id = q.id 
    AND r.rnum = q.rnum 
GROUP BY r.id 

Выход:

 
| ID | VALUE1 | VALUE2 | VALUE3 | 
|----|--------|--------|--------| 
| 1 |  10 |  12 | (null) | 
| 2 |  24 |  25 | (null) | 
| 3 |  4 | 7.1 |  1 | 

Примечание:Он не будет быстро вспыхивать.

Вот SQLFiddle демо


Теперь GROUP_CONCAT() ваш запрос может выглядеть

SELECT id, GROUP_CONCAT(value ORDER BY data) data_values 
    FROM runnerdata 
GROUP BY id 

Выход:

 
| ID | DATA_VALUES | 
|----|----------------| 
| 1 | 10.00,12.00 | 
| 2 | 24.00,25.00 | 
| 3 | 4.00,7.10,1.00 | 

Вот SQLFiddle демо

Затем в коде клиента explodedata_values значения столбца в то время как итерация по resultsest и производят желаемый результат.

+0

может быть столбцом значений по идентификатору в одной строке? .. –

+1

@ Это именно то, что я показал в своем втором примере с ' GROUP_CONCAT'. Все значения упакованы в виде списка с разделителями в столбце 'data_values' для каждого идентификатора. Или вы имели в виду что-то еще? – peterm

+0

@OlafErlandsenTriskel Я чувствую, что ответ был полезен, пожалуйста, рассмотрите ** [accept] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) ** it , – peterm

1

Как вы сказали в комментариях:

i need only value column, but all value column in one row by id. 

В этом случае вы можете использовать функцию GROUP_CONCAT. Я упростил ваш случай к минимальному рабочему примеру:

mysql> SELECT * FROM data; 
+----+-------+ 
| id | value | 
+----+-------+ 
| 1 | 1  | 
| 1 | 2  | 
| 2 | 3  | 
| 2 | 4  | 
| 2 | 5  | 
+----+-------+ 
5 rows in set (0.00 sec) 

SELECT 
    data.id, 
    GROUP_CONCAT(data.value) 
FROM 
    data 
GROUP BY 
    data.id; 

gives this: 

+----+--------------------------+ 
| id | GROUP_CONCAT(data.value) | 
+----+--------------------------+ 
| 1 | 1,2      | 
| 2 | 3,4,5     | 
+----+--------------------------+ 

SQL скрипку временно недоступен, так что дает вам CREATE TABLE заявление:

CREATE TABLE `data` (
    `id` int(11) NOT NULL, 
    `value` varchar(30) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `data` VALUES (1,'1'), (1, '2'),(2,'3'),(2,'4'),(2,'5'); 
+0

Мне нужно значение для преобразования CSV: "value", "values2", "value3", "value 4 \" "," value5 "\ n –

+0

@OlafErlandsenTriskel Если вы используете php после получения данных из SQL, вы можете конвертировать в CSV или выводить в CSV-файл непосредственно из mysql: http://stackoverflow.com/questions/356578/how-to-output-mysql-query-results-in-csv-format – user4035

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