社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Rodrigo • 5 年前 • 1861 次点击  

如何检索列和其他变量中具有相同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
 
1861 次点击  
文章 [ 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