私信  •  关注

Caius Jard

Caius Jard 最近创建的主题
Caius Jard 最近回复了
5 年前
回复了 Caius Jard 创建的主题 » mysql:我如何在列中检索两个id相同但值不同的行

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

你可以用这种手动方式工作,并设置 dataGridView1.AutoGenerateColumns = false; 会有帮助,因为然后你的DGV会抱怨它试图找到但却找不到的列…

……但老实说,你不应该这样做。它速度慢,效率低,类型弱,结构差。查看MSDN官方教程 https://msdn.microsoft.com/en-us/library/fxsa23t6.aspx -阅读“创建简单数据应用程序”演练

你要采取的基本步骤是:

  1. 向项目添加数据集
  2. 将其连接到数据库
  3. 将检验报告表放入数据集中
  4. 保存,切换到窗体
  5. 将“检查报告”节点从“数据源”窗口中拖放到窗体上

若要自定义查询以便进行筛选,请右键单击生成的TableAdapter并选择“配置”-您将能够逐步完成一个向导,该向导允许您参数化查询。表单中的代码需要稍作调整,以便将textbox3的内容作为查询参数传入

VS将在幕后编写您编写的所有代码(以及更多的代码,还有更多的代码,更好的[抱歉]),并将它们连接起来,以便在表单上有一个网格,其中包含正确数据绑定的列等。大约需要30秒,它就会立即工作,变得健壮,更好地封装,不会让按钮点击事件处理程序在字符串中填充满sql。

请根据控件的作用命名控件-textbox3和datagridview1是控件的糟糕名称