我有一张表persons(id, fist, last)
和另一张表properties(person_id, property_name, property_value)
。
每个人可能有许多(未定义)属性,这些属性的名称可能会根据用户的收藏而有所不同。例如,对于这些记录,我们需要以下输出:
properties
==========
person_id property_name property_value
----------------------------------------
1 Gender Male
1 Education Under
person
======
id first last
----------------
1 John Smith
result
======
id First Last Gender Education
-----------------------------------
1 John Smith Male Under
有没有一种简单的方法可以在不使用查询数据库的几个步骤的情况下完成此操作?我的意思是使用子查询,加入,分组或任何其他必要的工作来完成这项工作?
PS。我正在使用sqlite2& 3
谢谢,
马哈茂德
答案 0 :(得分:2)
你可以做到
SELECT
pers.id,
pers.first,
pers.last,
gender.property_value AS gender,
edu.property_value AS education
FROM person pers
LEFT JOIN properties gender
ON (gender.person_id = pers.id AND gender.property_name = 'Gender')
LEFT JOIN properties edu
ON (edu.person_id = pers.id AND edu.property_name = 'Education')
但是无法为任意数量的列执行此操作。您需要知道所需的列并相应地加入。
可以做什么,是事先用另一种语言动态构建查询,然后执行该查询。如果您这样做,请使用参数。请?
如果需要,您可以创建一个显示person_ids所有属性的视图:
CREATE VIEW all_properties (
person_id,
gender,
education
)
AS SELECT
pers.person_id,
gender.property_value,
edu.property_value
FROM (SELECT DISTINCT person_id FROM properties) pers
LEFT JOIN properties gender
ON (gender.person_id = pers.person_id AND gender.property_name = 'Gender')
LEFT JOIN properties edu
ON (edu.person_id = pers.person_id AND edu.property_name = 'Education')
但这并没有太大的区别。