3

私は次のテーブルを持っています:

  1. products-在庫の製品が含まれています。
  2. suppliers-サプライヤーの詳細が含まれています。
  3. product_category-製品カテゴリの名前が含まれています。
  4. product_suppliers-製品とサプライヤー間の関係が含まれています。

ここで重要なのはおそらく、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_levelありreorder_levelます。前者が後者より少ない場合は、再注文のリストに製品を含める必要があります。

リストのクエリを作成しようとしていますが、正しく機能していません。

2つのサプライヤーに影響を与える再注文の対象となる4つのアイテムがあります。サプライヤごとに2つのアイテムが必要ですが、現在は最初のサプライヤの結果のみを取得しています。

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 |
+---------+------+-----------------+-----------+-------------+---------------+---------------+--------+-----------+

これがリストのクエリで、私が期待していた4つのアイテムのうち2つだけを示す結果が表示されます。

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 |
+---------+------+-----------------+------------------------+-------------+---------------+-------------+------------+---------------+--------------+---------------+--------+
4

2 に答える 2

3

問題は、結果が AES_DECRYPT() から来ていることです。そのstringため、stock_level と reorder level の値を比較し、表示さ3 - 512 - 20ているのに表示され6 -159 - 20いないのは、文字列 6 として 6 と 15 を比較すると表示されないためです。 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すると、結果が数値にキャストされます

お役に立てれば。

于 2013-03-18T07:05:34.287 に答える
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

AES_ENCRYPT 関数を使用してデータを挿入するときに CAST ステートメントを使用しない場合は、データ型として VARCHAR を渡すことにより、AES_DECRYPT 関数を使用して同じデータを表示できます。data-type を AES_DECRYPT に渡さない場合、VARBINARY データ型が返されます。

于 2013-03-18T07:04:49.683 に答える