2010-03-26 43 views
1

我前段时间创建了一个凌乱的查询来获取产品代码列表。我正在尝试清理我的表格和我的代码。我最近试图重写查询,以便它更易于使用和理解。原始查询的效果很好,但它需要多个搜索字符串才能执行一次搜索,因为它使用了UNION,而且还有其他一些问题。我最近修改的查询更容易理解,只需要一个搜索字符串,但返回的结果不同。基本上新的查询将记录留下,我想了解为什么以及如何解决它。这里有两个查询(搜索字符串均为空):重写mysql查询返回意想不到的结果,试图找出原因

原始查询:

$query = 'SELECT product_code FROM bus_warehouse_lots WHERE status=\'2\''.$search_string_1 
    .' UNION SELECT product_code FROM bus_po WHERE status=\'0\''.$search_string_2 
    .' UNION SELECT bus_warehouse_entries.new_product_code AS product_code FROM (bus_warehouse_entries LEFT JOIN bus_warehouse_transfers ON bus_warehouse_entries.picking_ticket_num=bus_warehouse_transfers.pt_number) LEFT JOIN bus_warehouse_lots ON bus_warehouse_entries.ebooks_lot_id=bus_warehouse_lots.id WHERE bus_warehouse_entries.type=\'6\' AND bus_warehouse_transfers.status=\'0\''.$search_string_3 
    .' UNION SELECT bus_contracts.main_product AS product_code FROM bus_contracts LEFT JOIN bus_warehouse_lots ON bus_contracts.main_product=bus_warehouse_lots.product_code WHERE bus_contracts.status=\'0\''.$search_string_4 
    .' UNION SELECT prod_id AS product_code FROM bus_products WHERE last_usage > \''.date('Y-m-d', strtotime('-12 months')).'\''.$search_string_5 
    .' ORDER BY product_code'; 

新查询:

$query = 'SELECT bus_products.prod_id FROM bus_products' 
    .' LEFT JOIN (bus_warehouse_lots, bus_po, bus_warehouse_entries, bus_contracts) ON (' 
    .'bus_products.prod_id = bus_warehouse_lots.product_code' 
    .' AND bus_products.prod_id = bus_po.product_code' 
    .' AND bus_products.prod_id = bus_warehouse_entries.new_product_code' 
    .' AND bus_products.prod_id = bus_contracts.main_product)' 
    .' LEFT JOIN bus_warehouse_transfers ON' 
    .' bus_warehouse_entries.picking_ticket_num = bus_warehouse_transfers.pt_number' 
    .' WHERE (bus_products.last_usage > \''.date('Y-m-d', strtotime('-12 months')).'\'' 
    .' OR bus_warehouse_lots.status = \'2\'' 
    .' OR bus_po.status = \'0\'' 
    .' OR (bus_warehouse_entries.type = \'6\' AND bus_warehouse_transfers.status = \'0\')' 
    .' OR bus_contracts.status = \'0\')' 
    .$search_string_6 
    .' GROUP BY bus_products.prod_id' 
    .' ORDER BY bus_products.prod_id'; 
+0

我们可以得到一个搜索字符串的样本吗? – CogitoErgoSum 2010-03-26 16:31:49

+0

为了测试目的,搜索字符串设置为空。 – 2010-03-26 21:53:43

回答

0

虽然我不知道你的代码语言,但看起来像PHP,请原谅我缺少。$ string格式。我知道你正在使用转义序列作为静态值的引号,例如状态,类型等,为了简单的可读性我被剥离了。

当我知道我将连接表并期望双方的条目(因此为左连接)时,我跳过该条并将其作为我的直接WHERE子句并直接在FROM中列出所有表。另外,对于MySQL的性能,我告诉它做在我陈述的顺序查询(通过关键字STRAIGHT_JOIN)

SELECT STRAIGHT_JOIN 
     DISTINCT bus_products.prod_id 
    FROM 
     bus_products, 
     bus_warehouse_lots, 
     bus_po, 
     bus_warehouse_entries, 
     bus_contracts, 
     bus_warehouse_transfers 
    WHERE 
      bus_products.prod_id = bus_warehouse_lots.product_code 
     AND bus_products.prod_id = bus_po.product_code 
     AND bus_products.prod_id = bus_warehouse_entries.new_product_code 
     AND bus_products.prod_id = bus_contracts.main_product 
     AND bus_warehouse_entries.picking_ticket_num = bus_warehouse_transfers.pt_number 
     AND (  bus_products.last_usage > {yourDateStringFormatted} 
       OR bus_warehouse_lots.status = '2' 
       OR bus_po.status = '0' 
       OR ( bus_warehouse_entries.type = '6' 
        AND bus_warehouse_transfers.status = '0') 
       OR bus_contracts.status = '0' 
      ) 
      { plus your $search_string_6 } 
    ORDER BY 
      bus_products.prod_id 

我会剥夺我们对您Last_Usage日期条款和您的搜索字符串6,以确保您至少得到“ALL”预期的条目。如果您仍然不在,请确保您的OR/AND条件在预期的情况下得到适当平衡。然后,在你的日期限制中重新加入,确保没问题,然后添加你的最终搜索字符串6.

+0

我改变了我的查询,并导致我的脚本无限期挂起。唯一的区别是我在where子句中使用OR,因为我想为符合任何条件的记录提供id,并且我还将group by子句放在中,因为我希望在将来获得列SUM后这部分工作。任何想法为什么它挂起?有关如何解决原始查询的其他想法? – 2010-03-26 21:52:42

+0

查询的前5个部分必须是AND子句...这些是加入你的表的基础 - 在左加入的列表中...它告诉查询表如何相关...通过改变这些对于OR,你得到了一个对所有5个表的笛卡尔连接,导致1 * x * x * x * x * x记录,这会使它挂起。保持AND的前5将保持表格之间的1:1比例。查询的REST是您要应用的“过滤标准”。 – DRapp 2010-03-27 22:22:15

+0

我还没有看到/听到过......在切换到“AND”子句后它是否工作?此外,作为论坛的新手,当有人为您的问题提供解决方案时,最好点击解决方案的复选标记。这可以帮助他人接受答案,并帮助他人寻找答案,此外,如果/当您对合法答案的接受程度低时,其他人可能不会提供帮助...... – DRapp 2010-04-09 19:09:31

0

这是dq,不知道如何以自己身份登录,因为我是一个客人。无论如何...

我明白你在说关于使用ANDs来确定表关系,但是这不会只返回匹配所有AND标准的结果吗?如果没有匹配的转移记录,这不会返回产品id吗?有时产品ID可以在其中一列中找到匹配项,但其他列中没有匹配项。我希望查询能够在所提到的任何一个表中找到可以找到匹配产品ID的记录,但不会返回在任何其他表中找不到匹配表的记录。这仍然是最好的方式吗?