Py学习  »  DATABASE

mysql:我如何在列中检索两个id相同但值不同的行

Rodrigo • 5 年前 • 1821 次点击  

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

如您所见,付款方式有稳定的价值,订单总额是可变的。

我试过:

从meta_key in('付款方式')的'data'中选择*, 'order_total')按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            |
| ...        | ...             | ...              |
+------------+-----------------+------------------+

我只想要支付方式=签证和他各自的邮资。

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

谢谢您。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48118
 
1821 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Caius Jard
Reply   •   1 楼
Caius Jard    5 年前

您遇到的“问题”是,相关的数据位于不同的行上,这实际上使它不相关。您需要将此表连接到自身,或者执行一个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'
ϻᴇᴛᴀʟ
Reply   •   2 楼
ϻᴇᴛᴀʟ    5 年前

你可以用 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
Tim Biegeleisen
Reply   •   3 楼
Tim Biegeleisen    5 年前

使用旋转逻辑查找每个键所需的值。子查询别名为 d2 按邮递方式汇总,只返回支付方式为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;

screen capture from demo

Demo