0

我有以下一组带有附加查询的表。显然,我在其中填充了太多AND子句,现在没有结果是有效的,即使是结果。下面显示的是我正在使用的图表和 SQL。

MySQL 数据库模型隐藏字段并不重要。

SELECT p.products_id, pd.language_id, pd.products_name,
       pd.products_description, pd.products_url, p.products_quantity,
       p.products_model, p.products_image, p.products_price, p.products_virtual,
       p.products_weight, p.products_date_added, p.products_last_modified,
       p.products_date_available, p.products_status, p.manufacturers_id,
       p.products_quantity_order_min, p.products_quantity_order_units, p.products_priced_by_attribute,
       p.product_is_free, p.product_is_call, p.products_quantity_mixed,
       p.product_is_always_free_shipping, p.products_qty_box_status, p.products_quantity_order_max, p.products_sort_order, 

FROM `magez_products` p, `magez_products_description` pd
       WHERE p.products_id = pd.products_id
       AND p.products_id = 186
       AND p.products_id = cfv.products_id 
       AND cfv.nation_id = cfvn.nation_id
       AND cfv.clan_id = cfvc.clan_id
       AND cfv.rarity_id = cfvr.rarity_id
4

4 回答 4

1

在这些情况下,我通常做的是从较小的查询(例如一个 AND)开始并越来越多地增加查询,直到您会看到它从哪里开始“没有结果”。否则很难调试。

于 2012-11-13T21:14:34.253 回答
1

这不是完整的 select 或 mysql 应该抱怨的,因为 select 缺少 cfv、cfvn、cfvc 和 cfvr 表。

and ...您可以通过从子句末尾一一删除来解决它,where并查看结果从何处再次开始出现行。

例如,一个问题可能是连接表(例如 pd、cfv)缺少 a products_id

另一个解决方案可能是用左连接替换内部连接,当然这取决于您的要求。

于 2012-11-13T21:15:18.930 回答
1

你需要加入声明

SELECT p.products_id, pd.language_id, pd.products_name,
   pd.products_description, pd.products_url, p.products_quantity,
   p.products_model, p.products_image, p.products_price, p.products_virtual,
   p.products_weight, p.products_date_added, p.products_last_modified,
   p.products_date_available, p.products_status, p.manufacturers_id,
   p.products_quantity_order_min, p.products_quantity_order_units,         
p.products_priced_by_attribute,
   p.product_is_free, p.product_is_call, p.products_quantity_mixed,
   p.product_is_always_free_shipping, p.products_qty_box_status,                                                                               p.products_quantity_order_max,
p.products_sort_order, 

FROM `magez_products` p
join `magez_products_description` pd
on p.products_id = pd.products_id
   AND p.products_id = 186
   AND p.products_id = cfv.products_id      <-------------- what is cfv  join   on that too !!!!!!!!!!
   AND cfv.nation_id = cfvn.nation_id
   AND cfv.clan_id = cfvc.clan_id
   AND cfv.rarity_id = cfvr.rarity_id
于 2012-11-13T21:18:23.167 回答
1

为了提供帮助,我也是老式的 ANSI 格式...您会发现更多使用表之间的 JOINS 编写的当前查询,并且仅在您实际想要“限制”的地方应用“AND”。有时,这可能直接在连接处,而不是主要的“来自”表。此外,通过作为连接,您可以准确地看到表“A”如何连接到表“B”,并且我尝试保持 A = B 比较的顺序与列出的表相同...... =的左侧,=右侧的右侧表如

SELECT 
      p.products_id, 
      pd.language_id, 
      pd.products_name,
      pd.products_description, 
      pd.products_url, 
      p.products_quantity,
      p.products_model, 
      p.products_image, 
      p.products_price, 
      p.products_virtual,
      p.products_weight, 
      p.products_date_added, 
      p.products_last_modified,
      p.products_date_available, 
      p.products_status, 
      p.manufacturers_id,
      p.products_quantity_order_min, 
      p.products_quantity_order_units, 
      p.products_priced_by_attribute,
      p.product_is_free, 
      p.product_is_call, 
      p.products_quantity_mixed,
      p.product_is_always_free_shipping, 
      p.products_qty_box_status, 
      p.products_quantity_order_max, 
      p.products_sort_order
   FROM 
      magez_products p
         JOIN magez_products_description pd
            on p.products_id = pd.products_id
         JOIN magez_cfv_cards cfv
            on p.products_id = cfv.products_id
            JOIN magez_cfv_nations cfvn
               on cfv.nation_id = cfvn.nation_id
            JOIN magez_cfv_clans cfvc
               on cfv.clan_id = cfvc.clan_id
            JOIN magez_cfv_rarity cfvr
               on cfv.rarity_id = cfvr.rarity_id
   where
      p.products_id = 186

请注意我的格式,它与您的表结构相关... A 连接到 B,B 连接到 C,D 和 E 在各自的列上。WHERE 子句在您想要的确切标准上很简单......

现在,如果您只想要某些其他元素,您只需将“AND”添加到该组件的 JOIN 标准即可。

于 2012-11-13T21:18:48.297 回答