我有一组具有以下结构的表
**EntityFields**
fid | pid
1 | 1
2 | 1
3 | 2
4 | 2
5 | 1
**Language**
id | type | value
1 | Entity | FirstEntity
2 | Entity | SecondEntity
1 | Field | Name
2 | Field | Age
3 | Field | Name
4 | Field | Age
5 | Field | Location
现在您可能已经理解,第一个表为每个实体提供了EntityField分配。第二个表格给出了这些ID的名称。我想要输出的内容类似于以下
1 | FirstEntity / Name (i.e. a concat of the Entity and the EntityField name)
2 | FirstEntity / Age
3 | FirstEntity / Location
4 | SecondEntity / Name
5 | SecondEntity / Age
这可能吗?
感谢您的回答,遗憾的是表结构是我无法改变的。它自己的表结构属于另一个数据目录系统,它非常灵活,我用它来提取数据。我知道如果没有提供必要的背景,这个表结构看起来很奇怪,但是它的效果非常好(除了在这种情况下)。
我会在这里试试这些例子并告诉你。
答案 0 :(得分:2)
对于您当前的表结构,我认为以下内容将起作用
SELECT EntityFields.fid, CONCAT(L1.value, ' / ' L2.value)
FROM EntityFields INNER JOIN Language as L1 ON EntityFields.pid=L1.id and L1.type='Entity'
INNER JOIN Language as L2 ON EntityFields.fid=L2.id and L2.type='Field'
ORDER BY EntityFields.fid
但是,通过拥有更好的表结构,可以更轻松地进行此查询。例如,使用以下结构:
**EntityFields**
fid | pid | uid
1 | 1 | 1
2 | 1 | 2
1 | 2 | 3
2 | 2 | 4
3 | 1 | 5
**Entities**
id | value
1 | FirstEntity
2 | SecondEntity
**Fields**
id | value
1 | Name
2 | Age
3 | Location
您可以使用稍微简单的查询:
SELECT uid, CONCAT(Entities.value, Fields.value)
FROM EntityFields INNER JOIN Entities ON EntityFields.pid=Entities.id
INNER JOIN Fields ON EntityFields.fid=Fields.id
ORDER BY uid
答案 1 :(得分:0)
如果我理解你的问题,我认为我不这样做,这很简单。它似乎是一组设计非常糟糕的表格(例如,语言不止一件事)。并且看起来语言表有两种类型的记录:a)实体记录,其具有type ='Entity'和b)Field记录,其具有type ='Field'。
无论如何,我接近它的方式是将语言表视为两个表:
select ef.fid, Entities.value, Fields.value
from entityfields ef
inner join language Entities
on Entities.id = ef.id
and Entities.type = 'Entity'
inner join language Fields
on Fields.id = ef.id
and Fields.Type = 'Field'
order by 2, 3
无论如何,首先刺伤。这应该可以帮助你得到答案。
答案 2 :(得分:0)
好吧,我不知道你在这里想要完成什么。事实上,你标记一些记录“实体”和其他“字段”,然后尝试将它们彼此连接,这使我看起来像你在同一个表中混合两个完全不同的东西。为什么不拥有实体表和字段表?
您可以通过编写
来获得您想要的结果select fid, le.value, lf.value
from entittyfields e
join language le on e.pid=le.id and type='Entity'
join language lf on e.fid=lf.id and type='Field'
order by fid
但我认为重新考虑你的桌面设计是明智的。也许你可以解释一下你想要完成的事情。
答案 3 :(得分:0)
SELECT ef.fid AS id
, COALESCE(e.value, '-', ef.pid, ' / ', f.value)
AS entity_field
FROM EntityFields ef
JOIN Language AS e
ON e.id = ef.id
AND e.type = 'Entity'
JOIN Language AS f
ON f.id = ef.id
AND f.type = 'Field'
ORDER BY ef.pid
, ef.fid