在MySQL中映射值?

在MySQL中映射值?,mysql,union,Mysql,Union,我有一个类似于以下的查询(删除了许多不相关的垃圾,因为这更像是一个概念问题): 输出如下所示: name | value bank_name | My Bank bank_date | 12-12-12 bank_name | My Bank2 bank_date | 13-12-12 但我需要以下输出: bank_name | bank_date My Bank | 12-12-12 My Bank2 | 13-12-12 这样做的最佳方式是什么?我想您应该选择这样的方式:

我有一个类似于以下的查询(删除了许多不相关的垃圾,因为这更像是一个概念问题):

输出如下所示:

name      | value
bank_name | My Bank
bank_date | 12-12-12
bank_name | My Bank2
bank_date | 13-12-12
但我需要以下输出:

bank_name | bank_date
My Bank   | 12-12-12
My Bank2  | 13-12-12

这样做的最佳方式是什么?

我想您应该选择这样的方式:

SELECT o.bank_name, o_prop.bank_date

你能描述一下你的桌子吗?(列举他们的字段)

我假设您希望选择类似的内容:

SELECT o.bank_name, o_prop.bank_date

你能描述一下你的桌子吗?(列举他们的字段)

从您的输出来看,您似乎在使用类似于的内容,还是我弄错了?如果是这样的话,在SQL中这样做并不是一个好主意,最好按照@Najzero的建议在应用层中这样做(在这种情况下,数据透视将不起作用)


如果您真的需要SQL中的它,那么检查一下,它会满足您在这种情况下的需要。然而,在大多数情况下,除了这个简单的查询之外(当您需要使用EAV并且无法执行正确的表模型时),它可能执行得很差,导致数据不一致或者根本不可能。保持简单可能是最终处理此类系统的一种“更理智”的方法。

从您的输出来看,您似乎在使用类似于的方法,还是我弄错了?如果是这样的话,在SQL中这样做并不是一个好主意,最好按照@Najzero的建议在应用层中这样做(在这种情况下,数据透视将不起作用)


如果您真的需要SQL中的它,那么检查一下,它会满足您在这种情况下的需要。然而,在大多数情况下,除了这个简单的查询之外(当您需要使用EAV并且无法执行正确的表模型时),它可能执行得很差,导致数据不一致或者根本不可能。保持简单可能是最终处理此类系统的一种“更明智”的方法。

您能给出一个更精确的表结构示例吗?最好的方法是在应用层。但是,如果你想在mysql中实现这一点,请看一下pivot(ing)——这篇文章是一个很好的读物,你能给出一个更精确的表结构示例吗?最好的方法是在应用层。但是,如果你想在mysql中实现这一点,请看一下pivot(ing)——这篇文章很值得一读,最后我希望能够做到这一点,是的!在o_prop
id
name
value
中只有3列,我希望能够使用
name
选择
value
,如果有意义的话?对不起,如果没有,我不知道该如何表达。最后我希望能够做到这一点是的!在o_prop
id
name
value
中只有3列,我希望能够使用
name
选择
value
,如果有意义的话?很抱歉,如果没有,我不知道如何表达这一点。遗憾的是,它不可能在应用程序层这样做,因为它是馈送到第三方报告应用程序@andy JW的回答就足够了。只需注意,
o
连接是不必要的(因为它的任何列都没有出现在输出中),除非
o_oprop
中有行,而
o
中没有相应的行。它做了一些工作,但查询中还有其他连接,它选择了100多个需要*的字段(这不是我的决定!哈哈。)这样做
SELECT*,MAX(当…
产生语法错误时,我不知道如何在不手动列出select中的每个字段的情况下绕过它。@安迪,这就是EAV的问题……您不能
select*
,因为
group by
不允许您访问单个值,而只允许访问聚合。列出每个字段可能是您进行搜索的唯一方法n(但不是全部输入,你可以用脚本生成)。耶!我想出了一种不同的方法。它很混乱,但也可以。基本上只是一个子查询:
SELECT(从o中选择o_prop.value,其中o.id=xxx)正如bank_name一样,遗憾的是,在应用程序层不可能这样做,因为它正在向第三方报告应用程序提供数据!@andy JW.的回答就足够了。只需注意,
o
连接是不必要的(因为它的任何列都没有出现在输出中),除非在
o_oprop
中有行,但在
o
中没有相应的行。它做了一些工作,但在查询中还有其他连接,它选择了100多个需要*的字段(这不是我的决定!哈哈)。这样做
SELECT*,MAX(当…
产生语法错误时,我不知道如何在不手动列出select中的每个字段的情况下绕过它。@安迪,这就是EAV的问题……您不能
select*
,因为
group by
不允许您访问单个值,而只允许访问聚合。列出每个字段可能是您进行搜索的唯一方法n(但不是全部输入,你可以用脚本生成)。耶!我想出了一种不同的方法。它很混乱,但也可以。基本上只是一个子查询:
SELECT(从o中选择o_prop.value,其中o.id=xxx)作为bank_name
SELECT  MAX(CASE WHEN name = 'bank_name' THEN p.value ELSE NULL END) bank_name,
        MAX(CASE WHEN name = 'bank_date' THEN p.value ELSE NULL END) bank_date
FROM    o
        LEFT JOIN o_oprop p
            ON o.id = p.id
GROUP BY p.id