繁体   English   中英

Mysql:如何检索具有相同 id 但列中值不同的两行

[英]Mysql: How can I retrieve two rows with same id but different values in column

如何在列和其他变量中检索具有相同 id 和相同值的两行。 这是表“数据”

+---------+----------------+-------------+
| post_id | meta_key       | meta_value  |
+---------+----------------+-------------+
| 1000    | payment_method | visa        |
| 1000    | other          | sometext    |
| 1000    | order_total    | 65.00       |
| 1000    | etc            | sometext2   |
| 1001    | payment_method | bacs        |
| 1001    | other          | sometext    |
| 1001    | order_total    | 105.00      |
| 1001    | etc            | sometext2   |
| 1002    | payment_method | visa        |
| 1002    | other          | sometext    |
| 1002    | order_total    | 28.00       |
| 1002    | etc            | sometext2   |
| ...     | ...            | ...         |
+---------+----------------+-------------+

如您所见, payment_method 具有稳定的值,而 order_total 是可变的。

我试过了:

SELECT * FROM 'data' WHERE meta_key IN ('payment_method', 'order_total') GROUP BY post_id, meta_key

output

+---------+-----------------+------------+
| post_id | meta_key        | meta_value |
+---------+-----------------+------------+
| 1000    | payment_method  | visa       |
| 1000    | order_total     | 65.00      |
| 1001    | payment_method  | bacs       |
| 1001    | order_total     | 105.00     |
| 1002    | payment_method  | visa       |
| 1002    | order_total     | 28.00      |
| ...     | ...             | ...        |
+---------+-----------------+------------+

我只想要 payment_method = visa 和他各自的 post_id 金额。

+---------+-----------------+------------+
| post_id | meta_key        | meta_value |
+---------+-----------------+------------+
| 1000    | payment_method  | visa       |
| 1000    | order_total     | 65.00      |
| 1002    | payment_method  | visa       |
| 1002    | order_total     | 28.00      |
| ...     | ...             | ...        |
+---------+-----------------+------------+

谢谢你。

您遇到的“问题”是相关的数据位于不同的行上,这实际上使其不相关。 您需要将此表连接到自身,或执行 pivot 操作以使数据位于同一行

假设您想要 output 与您显示的完全一样:

SELECT * FROM data WHERE meta_key = 'payment_method' and meta_value = 'visa'

UNION ALL

SELECT a.* 
FROM data a
INNER JOIN data v 
ON
  v.meta_key = 'payment_method' and 
  v.meta_value = 'visa' and 
  a.meta_key = 'order_total' and 
  a.id = v.id

奇迹发生在联合之后的第二个查询中 - 我们再次选择所有签证行(别名为 v),就像联合之前的查询一样,但这次我们使用它作为过滤器来限制 order_total 行(别名为)。 v 表仅包含签证的 ID,因此当重新加入 ID 时,它会将a表过滤为仅相同的签证 ID 集。 a中的行只是订单总行,我们只选择a就排除了所有的v行信息。*


此查询是另一种形式,可能更容易理解:

SELECT * 
FROM data 
WHERE 
  meta_key in ('payment_method', 'order_total') and 
  ID in (SELECT x.id FROM data x WHERE x.meta_key = 'payment_method' and x.meta_value = 'visa')

这实际上是一回事。 为签证创建一个 ID 列表,然后使用它将结果过滤为“仅那些 ID”以及“仅付款方式和订单总行”

如果您最终想要同一行上的数据,那么现在使用 pivot 可能会更好,例如:

SELECT id, 'visa' as payment_method, max(case when meta_key = 'order_total' then meta_value end) as order_total
FROM data 
WHERE meta_key IN ('payment_method', 'order_total')
GROUP BY id 
HAVING max(case when meta_key = 'payment_method' then meta_value end) = 'visa'

您可以使用透视逻辑为每个键找到所需的值。 别名为d2的子查询按 post 聚合,并将仅返回付款方式为 Visa 的帖子。 然后,我们将您的原始data表加入到此子查询中,以仅限于您想查看的帖子。

SELECT
    d1.post_id,
    d1.meta_key,
    d1.meta_value
FROM data d1
INNER JOIN
(
    SELECT post_id
    FROM data
    GROUP BY post_id
    HAVING MAX(CASE WHEN meta_key = 'payment_method' THEN meta_value END) = 'visa'
) d2
    ON d1.post_id = d2.post_id
WHERE
    d1.meta_key IN ('payment_method', 'order_total')
ORDER BY
    d1.post_id,
    d1.meta_key DESC;

演示的屏幕截图

演示

您可以使用subquerygroup by

select post_id
    , meta_key
    , meta_value    
from data 
where post_id in 
    (select post_id 
    from data
    where meta_key in ('payment_method', 'order_total') and meta_value='visa'
    group by post_id
    having count(1) = 2)
order by post_id, meta_value desc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM