2017-02-22 67 views
0

我当前的查询是:的MySQL查询

select 
    item_description.fk_i_item_id, item_description.s_title, item_description.s_description, 
    category_description.s_slug, 
    item_resource.s_path, item_resource.s_extension, item_resource.pk_i_id 
FROM 
    item, item_description, category_description, item_resource 

WHERE 
    item.pk_i_id = item_description.fk_i_item_id 
AND 
    category_description.fk_i_category_id = 96 
AND 
    item.pk_i_id = item_resource.fk_i_item_id 

GROUP BY item.pk_i_id 
ORDER BY item.pk_i_id DESC 

基本上这些表存储了一些项目的信息(存储在item_resource可选的信息),我米试图从所有这些4个表得到的所有有用的信息,它的工作好当项目具有资源(在item_resource可选的信息),但如果该项目不具备的资源,那么该项目将不会出现结果。

所以我需要在项目被退回过,无论它是否对item_resource表或没有信息的结果。

回答

1

所以我需要一个结果,其中该项目返回太多,无论它是否有关于item_resource表的 信息。

然后考虑做OUTER JOIN和最有可能代替LEFT OUTER JOININNER JOIN。目前什么您正在执行是内连接,当你说FROM item, item_description, category_description, item_resource是一个旧式连接语法。您应该考虑使用ANSI风格JOIN语法,而。

而且,看不出有什么需要的是GROUP BY item.pk_i_id,因为你没有执行任何聚集。

我的意思是这样如下:

select 
    item_description.fk_i_item_id, item_description.s_title, 
    item_description.s_description, 
    category_description.s_slug, 
    item_resource.s_path, item_resource.s_extension, item_resource.pk_i_id 
FROM 
    item 
LEFT JOIN item_description ON item.pk_i_id = item_description.fk_i_item_id 
LEFT JOIN category_description ON category_description.some_column = item.pk_i_id 
AND category_description.fk_i_category_id = 96 
LEFT JOIN item_resource ON item.pk_i_id = item_resource.fk_i_item_id 
ORDER BY item.pk_i_id DESC; 
+0

是必须的“GROUP BY item.pk_i_id”因为有时候比资源更多,所以在这种情况下,该条目被复制。添加GROUP BY就像一个魅力。谢谢 – Saymon