0

我有一个支出表和一个日期表,它们由 date_id 和 id 连接...

我想要做的是从 1 个查询中获取来自支出的所有信息,加上所有支出的总和,但有一个限制和/或偏移量

这是现在的查询

SELECT spendings.id, spendings.price, spendings.title, 
       dates.date, users.username, currencies.value,
       ( SELECT SUM(sum_table.price) 
         FROM (
             SELECT s.price
             FROM spendings s, dates d
             WHERE s.date_id = d.id 
               AND day(d.date) = 25
             LIMIT 2 OFFSET 0
         ) as sum_table
       ) AS sum_price
FROM spendings, dates, users, currencies
WHERE spendings.date_id = dates.id 
  AND day(dates.date) = 25 
  AND spendings.user_id = users.id 
  AND spendings.curr_id = currencies.id
LIMIT 2 OFFSET 0

输出

id  price   title   date       username value  sum_price
3   6.00    title1  2013-11-25 alex     €      21.00
4   15.00   title2  2013-11-25 alex     €      21.00

它有效,但前提是此处的日期与此处day(d.date) = 25的外部日期相同day(dates.date) = 25

相反,如果我把这day(d.date) = day(dates.date)似乎是合乎逻辑的事情,我会得到#1054 - Unknown column 'dates.date' in 'where clause'

如果有人想让这个更简单,请告诉我:)

4

1 回答 1

1

尝试加入而不是使用嵌套的相关子查询:

SELECT spendings.id, spendings.price, spendings.title, 
      dates.date, users.username, currencies.value,
      y.sum_price
FROM spendings, dates, users, currencies
JOIN (
    SELECT day, SUM(sum_table.price) As sum_price
    FROM (
        SELECT day(d.date) As day,
               s.price
        FROM spendings s, dates d
        WHERE s.date_id = d.id 
          AND day(d.date) = 25
        LIMIT 2 OFFSET 0
    ) sum_table
    GROUP BY day
) y
ON y.day = day(dates.date)
WHERE spendings.date_id = dates.id 
  -- AND day(dates.date) = 25 <== commented since it's redundant now
  AND spendings.user_id = users.id 
  AND spendings.curr_id = currencies.id

一些备注:


不建议使用带逗号的旧连接语法:FROM table1,table2,table2 WHERE
推荐的连接表达方式是“新”ANSI SQL 连接语法:

FROM table1
[left|right|cross|[full] outer|natural] JOIN table2 {ON|USING} join_condition1
[left|right|cross|[full] outer|natural] JOIN table3 {ON|USING} join_condition2
....

实际上,这种“新语法”现在已经很老了,因为我记得它已经在 1992 - 22 年前发布了。在 IT 行业,22 年就像 22 岁。


于 2014-04-20T12:00:08.647 回答