2009-12-01 58 views
2

任何人都可以告诉我是否可以将以下两个查询合并为一个使用自连接的查询,如果是,如何执行?MySQL加入问题

查询1:

SELECT pm.username AS user, 
      uc.content_id AS id, 
      value AS filename, 
      name, 
      moderation_status AS status, 
      uc.parent_content_id 
    FROM myweb.ugc_meta um 
LEFT JOIN myweb.ugc_content uc ON uc.content_id = um.item_id 
LEFT JOIN myweb.userbase_member pm ON uc.user_id = pm.id 
    WHERE uc.content_type ='my.photo' 
     AND uc.promoted = '1' 
     AND moderation_status='passed' 
    LIMIT 10 

查询2:

SELECT value 
    FROM myweb.ugc_meta um 
WHERE um.item_id = '4780c650137a3409901286' 
-- (item_id is the content_parent_id from query 1) 

ugc_meta包含在ugc_content照片的相册名称。 ugc_content包含专辑和照片的行。 rows代表照片有一个parent_content_id这是父行的content_id。我没有选择更改表格或数据库结构。

目前我从查询1这是次优;-)

运行感谢每一个结果行一个新的查询(QUERY2)!

回答

0

你应该能够简单地使用LEFT JOIN的ugc_meta表,以便使用不同的别名来实现你的父表的连接,像这样:

SELECT pm.username AS user, 
      uc.content_id AS id, 
      value AS filename, 
      name, 
      moderation_status AS status, 
      uc.parent_content_id, 
      parent.`value` 
    FROM myweb.ugc_meta um 
LEFT JOIN myweb.ugc_content uc ON uc.content_id = um.item_id 
LEFT JOIN myweb.ugc_meta parent ON uc.parent_content_id = parent.item_id 
LEFT JOIN myweb.userbase_member pm ON uc.user_id = pm.id 
    WHERE uc.content_type ='my.photo' 
     AND uc.promoted = '1' 
     AND moderation_status='passed' 
    LIMIT 10 

我使用LEFT JOIN因为那时可能没有永远是子表中的parent_content_id,如果在这种情况下总是有父项,那么你可以使用INNER JOIN,这会提高你的性能收益。

1

,如果你想自加入你分配一个不同的aliase为每一个表,那么它应该没有问题

SELECT pm.username AS user, 
      uc.content_id AS id, 
      um.value AS filename, um2.value AS filename2 
      um.name, um2.name AS name2 
      moderation_status AS status, 
      uc.parent_content_id 
    FROM myweb.ugc_meta um 
LEFT JOIN myweb.ugc_content uc 
     ON uc.content_id = um.item_id 
LEFT JOIN myweb.userbase_member pm 
     ON uc.user_id = pm.id 
LEFT JOIN myweb.ugc_meta um2 
     ON id = um2.item_id 
    WHERE uc.content_type ='my.photo' 
     AND uc.promoted = '1' 
     AND moderation_status='passed' 
    LIMIT 10 

希望这个作品!

+0

谢谢 - 我得到它排序。 – codecowboy

1

这应做到:

SELECT pm.username AS user, 
     uc.content_id AS id, 
     value AS filename, 
     name, 
     moderation_status AS status, 
     um2.value AS 
FROM myweb.ugc_meta um 
LEFT JOIN myweb.ugc_content uc ON uc.content_id = um.item_id 
LEFT JOIN myweb.userbase_member pm ON uc.user_id = pm.id 
LEFT JOIN myweb.ugc_meta om2 ON um2.item_id = uc.parent_content_id 
WHERE uc.content_type ='my.photo' 
    AND uc.promoted = '1' 
    AND moderation_status='passed' 
LIMIT 10 

你可能要忍受 “嗯。”在value,namemoderation_status的前面,如果它们来自ugc_meta,否则该值将取自umum2