Mysql子查询还是多个查询?

时间:2013-12-02 11:12:20

标签: mysql sql subquery

我正在试图找出从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 != ?

我的方案一次迎合多个边界。对于要选择的对象表中的一行,必须通过所有边界。 (即,如果每个边界查询独立运行,则该行将出现在每组结果中)

我想知道是否有人对最佳方法有任何想法?

  • 在数据库的单个查询中使用每个边界的查询作为子查询(我的原始目标)
  • 将每个边界的查询作为完整查询运行,然后使用PHP处理结果

我更希望让数据库完成大部分工作,并且只是为了避免运行一堆查询而不是单个查询而吐出结果。这是一个棘手的部分,我试图使用子查询创建一个完整的查询,但我根本没有得到它的悬念。我的最新尝试如下:

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

对此最好的方法的任何见解将非常感激。

1 个答案:

答案 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)。如果我完全误解了你的问题,请告诉我! :)