[英]How do I retrieve two values from the same column based on two different conditions in MySQL?
[英]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;
您可以使用subquery
和group 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.