2012-10-23 84 views
1

我現有的查詢看起來是這樣的:SQL:查詢表格兩次,每個表格的標準不同。

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是「1」,而不是「2 「)。因此,我需要它找到acc_id AS'account'WHERE action_id與它當前正在選擇的記錄相同,其中part_id ='3'。

該查詢將選擇多個記錄,但不會爲每個記錄找到與其他條件匹配的記錄。在這種情況下,它仍然應該返回主記錄,但是其值爲'accounts'。

我的替代方法是用我提供的查詢,然後對於每個結果,再次檢查同一個表SELECT acc_id WHERE action_id = $ action_id AND part_id ='3'。我認爲在一個查詢中一定有辦法做到這一點?

我正在使用MySQL。

回答

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 
; 

此連接表給它自身。這就像有兩個單獨的表格副本。

因爲你有兩個副本,每個都需要它自己的名字。這就是AS mainAS other所做的,它只是給每個表格引用一個單獨的名稱。

LEFT JOIN就像是一個內部連接,除了它始終保留左側表中的記錄 - 即使它沒有連接到右側表中的任何記錄。

+0

感謝Dems,我也學到了很多東西!感謝米奇也,但不幸的是我的知識水平還不夠高,不足以實現你的建議。 –

0

這可以很容易地作爲procedure完成,但你也可以只是連續執行多個批次。考慮一下,如果您知道您需要提前使用的Part_ID,請使用IN clause

可能的是,在IN子句中填充的子查詢中獲取所需的Part_ID。 e.g:

SELECT /*actual columns*/ * 
FROM table 
WHERE predicate_column IN (
    SELECT predicate_column 
    FROM table 
    WHERE known_column = $known_value 
)