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

标签 mysql

如何在列和其他变量中检索具有相同 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

输出

+---------+-----------------+------------+
| 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      |
| ...     | ...             | ...        |
+---------+-----------------+------------+

谢谢。

最佳答案

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

假设您希望输出与您显示的完全一样:

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 行(别名为 a)。 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”以及“仅付款方式和订单总行”

如果您最终希望数据位于同一行,则最好立即使用类似以下内容的数据透视表:

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'

关于Mysql:如何检索具有相同ID但列中不同值的两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58602132/

相关文章:

c# 如何过滤数据库表的列名?

php - 在 Php 中从 MySql 输出中添加或删除缺货数据

php - 如何在查询中选择特定值加上额外的随机值?

php - WHILE 中的 IF 语句不起作用

php - 如何使用 LIKE 语法和 % WILDCARD % 跨多个表进行搜索

mysql - 显示表中除某些列之外的所有列

MySQL 触发器导致错误 #1064

mysql - 如何在 MySQL 中查找上周的数据

mysql - 使用数据库迁移与工作台

php - 使用 PHP MySQL(向上/向下按钮)手动排序?