【问题标题】:Complex MySQL Query, filter from multi table复杂的 MySQL 查询,从多表中过滤
【发布时间】:2011-10-27 13:14:05
【问题描述】:

我有一个 ORDER_TABLE 来存储所有 ORDER ( order_id , order_name )

一个 ORDER_ITEMS_TABLE 存储每个订单的所有项目( order_item_id 、 order_id 、 item_name )。每行是一个项目,一个订单在 ORDER_ITEMS_TABLE 中有很多行

我有一个输入,允许用户输入项目列表,用逗号分隔 (item1,item2,item3) 当用户提交时,我应该从 ORDER_TABLE 中获取所有包含上述所有项目的订单(item1 AND item2 AND item3)

请帮帮我

【问题讨论】:

    标签: mysql


    【解决方案1】:

    确保在将用户的逗号分隔项列表添加到查询之前对其进行解析,否则您将面临 SQL 注入攻击。

    SELECT ot.order_name, oit.item_name
    FROM ORDER_ITEMS_TABLE oit
    INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id
    WHERE oit.order_item_id IN (your,list,of,items)
    

    【讨论】:

    • 感谢您的帮助,但我需要选择包含所有订单而不是任何订单的订单
    • 这与原始问题有很大不同。您可以使用我给您的查询并减少脚本方面的结果 - 对于新问题,我想不出一个优雅的纯 SQL 解决方案。
    【解决方案2】:

    扩展@Crontabs 答案:

    $items = $_POST['items'];
    $item_array = explode(',',$items);
    foreach ($item_array as $item) 
    {
      $item = mysql_real_escape_string($item);
    }
    $items = implode("','", $item_array);
    $query = "SELECT ot.order_name, oit.item_name     
              FROM ORDER_ITEMS_TABLE oit     
              INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id     
              WHERE oit.order_item_id IN ('$items')  "; 
    

    现在您已经正确地转义了这些 CSV 项目。

    【讨论】:

    • user904427 没有将其标记为“php”,因此我没有做出任何假设。 ;)
    • @Crontab,根据用户的个人资料,他是 php 用户,所以这是有道理的 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多