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