您遇到的“问题”是,相关的数据位于不同的行上,这实际上使它不相关。您需要将此表连接到自身,或者执行一个pivot操作以使数据位于同一行
假设您希望输出与显示的完全一致:
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
奇迹发生在联合之后的第二个查询中-我们再次选择所有的visa行(别名为v),就像联合之前的查询一样,但这次我们使用它作为过滤器来限制order_total行(别名为a)。v表只包含visa的id,因此当在id上重新连接时,它会过滤
a
表中只显示同一组VISA ID。中的行
一
仅为Order Total行,我们仅通过选择a.*
此查询是一种可能更容易理解的替代形式:
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')
这实际上是一样的;为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'