我需要做些什么来纠正这个SQL语句?

时间:2013-03-18 05:31:49

标签: php mysql sql join

我有以下表格:

  1. products - 包含广告资源中的产品。
  2. suppliers - 包含供应商详细信息。
  3. product_category - 包含产品类别的名称。
  4. product_suppliers - 包含产品和供应商之间的关系。
  5. 这里重要的一点可能是product_suppliers,所以这里是列:

    id //(auto-increment)  
    prod_id //(id of product)  
    sup_id //(id of supplier)  
    preferred //(1 if it's the preferred supplier for that product - 0 if not)  
    cost_per_outer //(this suppliers price for this item)  
    qty_in_outer //(the number in a box)  
    

    product表格在存储产品详情信息时,还有一个stock_levelreorder_level字段。当前者小于后者时,产品应包含在列表中以便重新订购。

    我正在尝试为列表构建查询,但这种查询工作不正常。

    我有4件物品有资格重新订购影响两家供应商。每个供应商应该有两个项目,但目前只检索第一个供应商的结果。

    我正在使用MySQL和PHP。

    我运行以下查询,让我们对数据库中的实际数据有所了解:

    mysql> SELECT
        ->         p.prod_id,
        ->         AES_DECRYPT(p.alt_id, 'MW4KQLg1Irfo3Xz7Nxht')                         AS sku,
        ->         AES_DECRYPT(p.prod_name, 'MW4KQLg1Irfo3Xz7Nxht')                      AS prod_name,
        ->         AES_DECRYPT(p.prod_type, 'MW4KQLg1Irfo3Xz7Nxht')                    AS prod_type,
        ->         AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht')                    AS stock_level,
        ->         AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht')            AS reorder_level,
        ->         AES_DECRYPT(c.category_name, 'MW4KQLg1Irfo3Xz7Nxht')            AS category_name,
        ->         ps.sup_id,
        ->         ps.preferred
        -> FROM
        ->         products p
        -> INNER JOIN
        ->         product_category c
        ->   ON
        ->         p.category_id = c.category_id
        -> INNER JOIN
        ->         product_supplier ps
        ->   ON
        ->         p.prod_id = ps.prod_id
        -> INNER JOIN
        ->         suppliers s
        ->   ON
        ->         ps.sup_id = s.supplier_id
        -> ORDER BY
        ->         ps.sup_id;
    +---------+------+-----------------+-----------+-------------+---------------+---------------+--------+-----------+
    | prod_id | sku  | prod_name       | prod_type | stock_level | reorder_level | category_name | sup_id | preferred |
    +---------+------+-----------------+-----------+-------------+---------------+---------------+--------+-----------+
    |       7 | 7    | Term Block      | 1         | 3           | 5             | Electrical    |      2 |         1 |
    |       5 | 5    | Electrical Tape | 1         | 12          | 20            | Electrical    |      2 |         1 |
    |       6 | 6    | BlowGas         | 1         | 6           | 15            | Plumbing      |     12 |         1 |
    |       1 | 1    | PTFE Tape       | 1         | 9           | 10            | Plumbing      |     12 |         1 |
    +---------+------+-----------------+-----------+-------------+---------------+---------------+--------+-----------+
    

    以下是列表的查询,结果只显示了我期望的四个项目中的两个:

    mysql> SELECT
        ->         p.prod_id,
        ->         AES_DECRYPT(p.alt_id, 'MW4KQLg1Irfo3Xz7Nxht')                         AS sku,
        ->         AES_DECRYPT(p.prod_name, 'MW4KQLg1Irfo3Xz7Nxht')                AS prod_name,
        ->         AES_DECRYPT(p.prod_desc, 'MW4KQLg1Irfo3Xz7Nxht')                 AS prod_desc,
        ->         AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht')                AS stock_level,
        ->         AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht')             AS reorder_level,
        ->         AES_DECRYPT(p.reorder_qty, 'MW4KQLg1Irfo3Xz7Nxht')               AS reorder_qty,
        ->         p.vat_exempt,
        ->         AES_DECRYPT(p.lastorderdate, 'MW4KQLg1Irfo3Xz7Nxht')            AS lastorderdate,
        ->         AES_DECRYPT(p.lastorderqty, 'MW4KQLg1Irfo3Xz7Nxht')               AS lastorderqty,
        ->         AES_DECRYPT(c.category_name, 'MW4KQLg1Irfo3Xz7Nxht')          AS category_name,
        ->         ps.sup_id
        -> FROM
        ->         products p
        -> INNER JOIN
        ->         product_category c
        ->   ON
        ->         p.category_id = c.category_id
        -> INNER JOIN
        ->         product_supplier ps
        ->   ON
        ->         p.prod_id = ps.prod_id
        -> INNER JOIN
        ->         suppliers s
        ->   ON
        ->         ps.sup_id = s.supplier_id
        -> WHERE
        ->         AES_DECRYPT(p.prod_type, 'MW4KQLg1Irfo3Xz7Nxht') = 1
        ->   AND
        ->           AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht') <= AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht')
        ->   AND
        ->           ps.preferred = 1
        -> ORDER BY
        ->         ps.sup_id;
    +---------+------+-----------------+------------------------+-------------+---------------+-------------+------------+---------------+--------------+---------------+--------+
    | prod_id | sku  | prod_name       | prod_desc              | stock_level | reorder_level | reorder_qty | vat_exempt | lastorderdate | lastorderqty | category_name | sup_id |
    +---------+------+-----------------+------------------------+-------------+---------------+-------------+------------+---------------+--------------+---------------+--------+
    |       7 | 7    | Term Block      | Nylon connector block. | 3           | 5             | 20          |          0 | NULL          | NULL         | Electrical    |      2 |
    |       5 | 5    | Electrical Tape | Black                  | 12          | 20            | 100         |          0 | NULL          | NULL         | Electrical    |      2 |
    +---------+------+-----------------+------------------------+-------------+---------------+-------------+------------+---------------+--------------+---------------+--------+
    

2 个答案:

答案 0 :(得分:3)

问题是您的结果来自AES_DECRYPT()来自string类型,这就是为什么要比较3 - 512 - 20的stock_level和重新订购等级值而对于6 -159 - 20,它没有显示,因为如果您将comapre 6和15作为字符串6将超过15,则9和20的情况相同。

希望你有问题......

在比较之前将AES_DECRYPT()的结果转换为数字。

将您的where子句更改为此

WHERE
     (AES_DECRYPT(p.prod_type, 'MW4KQLg1Irfo3Xz7Nxht') + 0) = 1 AND
     (AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht') + 0) <= (AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht') + 0)

添加+0会将结果转换为数字

希望这有帮助。

答案 1 :(得分:0)

WHERE
    ->         AES_DECRYPT(p.prod_type, 'MW4KQLg1Irfo3Xz7Nxht',varchar) = 1
    ->   AND
    ->           AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht',varchar) <= AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht',varchar)

或:

WHERE
    ->         AES_DECRYPT(p.prod_type, 'MW4KQLg1Irfo3Xz7Nxht',int) = 1
    ->   AND
    ->           AES_DECRYPT(p.stock_level, 'MW4KQLg1Irfo3Xz7Nxht',varchar) <= AES_DECRYPT(p.reorder_level, 'MW4KQLg1Irfo3Xz7Nxht',varchar)

来自:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01015.1510/html/iqsecure/Functions_s_4132405.htm

  

如果在使用时插入数据时不使用CAST语句   AES_ENCRYPT函数,您可以使用AES_DECRYPT查看相同的数据   通过传递VARCHAR作为数据类型来实现。如果你没有通过   数据类型为AES_DECRYPT,返回VARBINARY数据类型。