1

私の既存のクエリは次のようになります。

SELECT
       id,
       refid,
       action_id,
       action_type,
       co_user_id,
       cust_vend_id,
       Aes_decrypt(cust_vend_name, '".DBKEY."') AS cust_vend_name,
       Aes_decrypt(amount, '".DBKEY."')         AS amount,
       Aes_decrypt(action_date, '".DBKEY."')    AS action_date,
       Aes_decrypt(memo, '".DBKEY."')           AS memo,
       Aes_decrypt(trans_id, '".DBKEY."')       AS trans_id,
       part_id,
       polarity
FROM   generated_actions
INNER join
        generated_actions.action_id             AS action_id
    ON
        (generated_actions.action
WHERE  acc_type = 2
   AND acc_id = $ba_id
   AND reverse_id IS NULL
ORDER  BY action_id,
          Aes_decrypt(action_date, '".DBKEY."'),
          entry_datetime ;

ただし、選択するレコードごとに、レコードから別の列を返す必要があります。そうしないと、除外されます(acc_idは「2」ではなく「1」であるため)。したがって、acc_id AS'アカウント'を見つけるために必要です。ここで、action_idは、現在選択しているレコードと同じであり、part_id='3'です。

クエリは複数のレコードを選択しますが、追加の基準のすべてのレコードに一致するものは見つかりません。その場合でもメインレコードを返す必要がありますが、'accounts'の値としてnullを使用します。

別の方法として、提供されたクエリを使用し、結果ごとに同じテーブルをもう一度確認します。SELECT acc_id WHERE action_id = $ action_id AND part_id='3'。1つのクエリでこれを行う方法があるはずだと思いますか?

MySQLを使用しています。

4

2 に答える 2

1
SELECT
  main.id,
  main.refid,
  main.action_id,
  main.action_type,
  main.co_user_id,
  main.cust_vend_id,
  Aes_decrypt(main.cust_vend_name, '".DBKEY."')   AS cust_vend_name,
  Aes_decrypt(main.amount,         '".DBKEY."')   AS amount,
  Aes_decrypt(main.action_date,    '".DBKEY."')   AS action_date,
  Aes_decrypt(main.memo,           '".DBKEY."')   AS memo,
  Aes_decrypt(main.trans_id,       '".DBKEY."')   AS trans_id,
  main.part_id,
  main.polarity,
  other.acc_id                                    AS other_acc_id
FROM
  generated_actions        AS main
LEFT JOIN
  generated_actions        AS other
    ON  other.action_id = main.action_id
    AND other.part_id   = 3
WHERE
      main.acc_type = 2
  AND main.acc_id   = $ba_id
  AND main.reverse_id IS NULL 
ORDER  BY
  main.action_id,
  Aes_decrypt(main.action_date, '".DBKEY."'),
  main.entry_datetime
; 

これはテーブルをそれ自体に結合します。これは、テーブルの2つの別々のコピーを持っているようなものです。

2つのコピーがあるため、それぞれに独自の名前が必要です。それが何でAS mainあり、何をするのかAS other、それはテーブルへの各参照に別々の名前を与えるだけです。

これLEFT JOINは内部結合に似ていますが、右側のテーブルのどのレコードにも結合していなくても、常に左側のテーブルのレコードを保持する点が異なります。

于 2012-10-23T06:00:24.807 に答える
0

これは手順として簡単に実行できますが、複数のバッチを連続して実行することもできます。事前に必要なPart_IDがわかっている場合は、IN句を使用することを検討してください。

潜在的に、IN句に詰め込むサブクエリで必要なPart_IDを取得します。例えば:

SELECT /*actual columns*/ *
FROM table
WHERE predicate_column IN (
    SELECT predicate_column
    FROM table
    WHERE known_column = $known_value
)
于 2012-10-23T05:58:19.833 に答える