如何从UNION ALL之外的另一个表中获取列值?

时间:2017-08-01 03:20:06

标签: mysql sql phpmyadmin

在我的SQL中,我收到与用户和业务相关的交易。但是,我还需要获得业务名称。它位于表Businesses下的business_name列中。在我的示例SQL中,我想获取business_id = 1的商业名称。我目前的代码除了没有获得公司名称外还可以使用。

(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

在我的第二次代码尝试中,它确实获得了业务名称,但是,在每一行中执行select是没有效率的,因为每行的业务名称都相同。我怎么能这样做并将其应用到每一行?也许在UNION ALL之外的某个地方?这是我的工作代码,但是,我想优化它,因此它不会从每个行中的business_name的业务中选择(因为它们共享相同的business_id,因此保证所有行的business_name相同)。

(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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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