2017-08-01 137 views
0

在我的SQL中,我正在获取与用户和业务有关的交易。但是,我也需要获得业务的名称。它位于表企业下的列business_name中。在我的示例SQL中,我想获取business_id = 1的商业名称。我目前的代码除了没有获得商业名称之外。如何从UNION ALL以外的其他表中获取列值?

(SELECT TRUNCATE(code_reward_amount, 2) AS amount, UNIX_TIMESTAMP(code_redeemed_date) AS date, 0 AS action_number 
FROM CodesRedeemed 
WHERE code_redeemed_by_user_id=191 AND code_business_id=1) 
UNION ALL 
(SELECT TRUNCATE(action_amount, 2) AS amount, UNIX_TIMESTAMP(action_date) AS date, action_number 
FROM BusinessAccountActions 
WHERE action_user_id=191 AND action_business_id=1) 
ORDER BY date DESC 
LIMIT 100 

在我的第二个代码的尝试,它得到了企业名称,但是,它是没有效率做选择每一行中因为业务名称将是各行相同。我如何做一次并将其应用到每一行?也许在UNION ALL以外的某个地方?这里是我的工作代码,但是,我想优化它,因此它不会在每行中为business_name选择Business(因为business_name保证对于所有行都是相同的,因为它们共享相同的business_id)。

(SELECT TRUNCATE(code_reward_amount, 2) AS amount, UNIX_TIMESTAMP(code_redeemed_date) AS date, 0 AS action_number, (SELECT business_name FROM Businesses WHERE business_id=1) AS business_name 
FROM CodesRedeemed 
WHERE code_redeemed_by_user_id=191 AND code_business_id=1) 
UNION ALL 
(SELECT TRUNCATE(action_amount, 2) AS amount, UNIX_TIMESTAMP(action_date) AS date, action_number, (SELECT business_name FROM Businesses WHERE business_id=1) AS business_name 
FROM BusinessAccountActions 
WHERE action_user_id=191 AND action_business_id=1) 
ORDER BY date DESC 
LIMIT 100 

Example results for query 2

business_id会根据业务变化。我现在只是测试它的business_id 1。我将如何优化(主要不检查每一行中的business_name)?谢谢。

回答

2

使用JOIN

SELECT u.amount, u.date, b.business_name, u.action_number 
FROM (
    (SELECT TRUNCATE(code_reward_amount, 2) AS amount, UNIX_TIMESTAMP(code_redeemed_date) AS date, 0 AS action_number 
    FROM CodesRedeemed 
    WHERE code_redeemed_by_user_id=191 AND code_business_id=1) 
    UNION ALL 
    (SELECT TRUNCATE(action_amount, 2) AS amount, UNIX_TIMESTAMP(action_date) AS date, action_number 
    FROM BusinessAccountActions 
    WHERE action_user_id=191 AND action_business_id=1) 
    ORDER BY date DESC 
    LIMIT 100) AS u 
CROSS JOIN Businesses AS b 
WHERE b.business_id = 1 
+0

谢谢巴尔玛! –

0

使用JOIN作为Bamar建议是做它完全可以接受的,而且是我最有可能做到这一点。

但是,您可以使用user defined variable并用该替换该附加选择。

SELECT business_name FROM Businesses WHERE business_id=1 LIMIT 1 INTO @bname; 

(SELECT TRUNCATE(code_reward_amount, 2) AS amount, UNIX_TIMESTAMP(code_redeemed_date) AS date, 0 AS action_number, (SELECT business_name FROM Businesses WHERE business_id=1) AS business_name 
FROM CodesRedeemed 
WHERE code_redeemed_by_user_id=191 AND code_business_id=1) 
UNION ALL 
(SELECT TRUNCATE(action_amount, 2) AS amount, UNIX_TIMESTAMP(action_date) AS date, action_number, @bname AS business_name 
    FROM BusinessAccountActions 
    WHERE action_user_id=191 AND action_business_id=1) 
    ORDER BY date DESC 
    LIMIT 100 
+0

谢谢你的回答。我甚至不知道用户定义的变量! –

+1

很高兴能够帮助并很高兴看到您将采用Barmar的方法,但使用不同的工具来解决问题总是很好的。 –

相关问题