-2

我有一个约 35.000.000 行的表(MySQL),我需要按 id 顺序检索所有数据。

表:数据

+--+-----+-----+
|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 和有效吗?

4

2 回答 2

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

输出:

| 身份证 | 价值1 | 价值2 | 价值3 |
|----|--------|--------|--------|
| 1 | 10 | 12 | (空) |
| 2 | 24 | 25 | (空) |
| 3 | 4 | 7.1 | 1 |

注意: 它不会很快。

这是SQLFiddle演示


现在GROUP_CONCAT()您的查询可能看起来像

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

输出:

| 身份证 | 数据值 |
|----|----------------|
| 1 | 10.00,12.00 |
| 2 | 24.00,25.00 |
| 3 | 4.00,7.10,1.00 |

这是SQLFiddle演示

然后在您的客户端代码explode中的列值,data_values同时迭代结果并产生所需的输出。

于 2013-09-06T19:19:56.737 回答
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 fiddle 暂时不可用,所以给你 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');
于 2013-09-06T19:36:07.947 回答