我正在试图找出从MySQL数据库获取数据并处理数据的最佳方法。我有2个表'对象'和'objects_metadata'。 objects_metadata表中的行属于objects表中的行,链接由objects_metadata中的'parent_id'列定义,该列对应于对象中的'id'列。 (下面的SQLFiddle)。
情景
当我搜索这些表时,我总是在寻找对象表中的行。我有时必须查询objects_metadata表以获得正确的结果。我通过定义诸如“hasMetadataWithValue”之类的边界来做到这一点。此边界将自行运行以下查询:
SELECT * FROM objects
INNER JOIN objects_metadata ON objects.id=objects_metadata.parent_id
WHERE objects_metadata.type_id = ? AND objects_metadata.value = ?
另一个示例边界“notSelf”将使用诸如以下的查询:
SELECT * FROM objects WHERE objects.id != ?
我的方案一次迎合多个边界。对于要选择的对象表中的一行,必须通过所有边界。 (即,如果每个边界查询独立运行,则该行将出现在每组结果中)
我想知道是否有人对最佳方法有任何想法?
我更希望让数据库完成大部分工作,并且只是为了避免运行一堆查询而不是单个查询而吐出结果。这是一个棘手的部分,我试图使用子查询创建一个完整的查询,但我根本没有得到它的悬念。我的最新尝试如下:
SELECT * FROM objects
WHERE type_id = 7
AND confirmed = 1
AND (SELECT * FROM objects WHERE objects.id != 1)
AND (SELECT * FROM objects LEFT JOIN objects_metadata ON objects.id=objects_metadata.parent_id WHERE objects_metadata.type_id = 8 AND objects_metadata.value ='male')
LIMIT 0,20
我可以看到我尝试使用这些子查询的方式显然是错误的,但我无法弄清楚正确的方法是什么。
SQL小提琴是here
对此最好的方法的任何见解将非常感激。
答案 0 :(得分:1)
我认为您可以将这些“边界”放在加入的查询中。
SELECT
*
FROM objects LEFT JOIN objects_metadata
ON objects.id = objects_metadata.parent_id
WHERE
objects_metadata.type_id = 8
AND objects.confirmed=1
AND ( objects.id!=1 )
AND ( objects_metadata.type_id=8 AND objects_metadata.value='male' )
LIMIT 0,20
SQL小提琴:http://sqlfiddle.com/#!2/0ee42/34
请注意两个表的相同列名,因此您还必须指定确切的表(例如,objects_metadata.type_id = 8)。如果我完全误解了你的问题,请告诉我! :)