2014-09-24 32 views
3
 SELECT 
      u.*, 
      GROUP_CONCAT(DISTINCT f.shot_id SEPARATOR ",") AS ownFavorites, 
      GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars, 
      GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots, 
      (SELECT AVG(p.count) 
       FROM points p 
       LEFT JOIN shots s ON s.user_id = **U.ID** AND p.shot_id = s.id 
       WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY) 
      ) AS attention, 
      (SELECT SUM(p.count) 
       FROM points p 
       LEFT JOIN shots s ON s.user_id = **U.ID** AND s.id = p.shot_id 
      ) AS popularity 
     FROM users u 
     LEFT OUTER JOIN shots s ON s.user_id = u.id 
     LEFT OUTER JOIN favorites f ON f.user_id = u.id 
     LEFT OUTER JOIN stars st ON st.user_id = u.id 
     WHERE u.username = ?; 

我有兩個子查詢使用參數u.id(在查詢中標記)。如果我做了這樣的SQL它會產生財產以後這樣的:傳遞值到子部分

#1054 - Unknown column 'u.id' in 'on clause' 

手段,u.id ID沒有在SubSelects定義。但在MainSelect我從users表中選擇,其中u.id存在。

對我的問題:有沒有辦法將所選的u.id值通過普通sql傳遞給Subselects

+0

這是不可能使用子查詢與一列從外部查詢的連接條件。 – Gervs 2014-09-24 17:58:58

回答

2

不要在子查詢忘記GROUP BY:

SELECT 
    u.*, 
    COALECSE(a.average, 0) attention, 
    COALESCE(p.total, 0) popular, 
    GROUP_CONCAT(DISTINCT f.shot_id) AS ownFavorites, 
    GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars, 
    GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots 
FROM 
    users u 
LEFT JOIN 
    (
    SELECT 
     s.user_id, 
     AVG(p.count) average 
    FROM 
     shots s 
    JOIN 
     points p 
     ON s.id = p.shot_id 
    WHERE 
     s.date >+ CURRENT_DATE - INTERVAL 2 DAY 
    GROUP BY s.user_id 
    ) a 
    ON u.id = a.user_id 
LEFT JOIN 
    (
    SELECT 
     s.user_id, 
     SUM(p.count) total 
    FROM 
     shots s 
    JOIN 
     points p 
     ON s.id = p.shot_id 
    GROUP BY s.user_id 
    ) p 
    ON u.id = p.user_id 
LEFT OUTER JOIN shots s ON s.user_id = u.id 
LEFT OUTER JOIN favorites f ON f.user_id = u.id 
LEFT OUTER JOIN stars st ON st.user_id = u.id 
WHERE u.username = 'user' 
+0

好的解決方案。在第一個'left join''變更之後''where'語句's.date'變爲'p.date';) – Smeaven 2014-09-24 20:04:03

1

嘗試將選擇轉換爲子選擇連接。

FROM users u 
LEFT OUTER JOIN shots s ON s.user_id = u.id 
LEFT OUTER JOIN favorites f ON f.user_id = u.id 
LEFT OUTER JOIN stars st ON st.user_id = u.id 
LEFT OUTER JOIN (SELECT AVG(p.count) AverageOfP, p.shot_id 
      FROM points p    
      WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY) 
     ) p ON p.shot_id = s.id 
LEFT OUTER JOIN (SELECT SUM(p.count) SumOfP, p.shot_id 
      FROM points p    
     ) p2 ON p2.shot_id = s.id 

s表已經加入到你,應該是好的。然後在你的選擇中,你可以選擇AverageOfP和SumOfP。

+0

我之前有過類似的情況,並且正在改變我解決的連接問題。我認爲你就在這裏。 – Deiwys 2014-09-24 17:56:13

+0

注意:'SUM'應該來自points表中的所有記錄。 「AVG」來自最後兩天的記錄 – Smeaven 2014-09-24 20:15:53

+0

@ user3389733現在應該修復。 – Vulcronos 2014-09-24 20:31:28

1

看起來像這樣可能工作。 select不知道用戶表的方式。我相信這將有用戶的知識。

SELECT 
     u.*, 
     GROUP_CONCAT(DISTINCT f.shot_id SEPARATOR ",") AS ownFavorites, 
     GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars, 
     GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots, 
     A.Attention, P.Popularity 
     FROM users u 
    LEFT OUTER JOIN shots s ON s.user_id = u.id 
    LEFT OUTER JOIN favorites f ON f.user_id = u.id 
    LEFT OUTER JOIN stars st ON st.user_id = u.id 
    LEFT OUTER JOIN 
     (SELECT AVG(p.count) attention 
      FROM points p 
      LEFT JOIN shots s ON s.user_id = **U.ID** AND p.shot_id = s.id 
      WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY) 
     ) AS A, 
     (SELECT SUM(p.count) popularity 
      FROM points p 
      LEFT JOIN shots s ON s.user_id = **U.ID** AND s.id = p.shot_id 
     ) AS P 
    WHERE u.username = ?; 
+0

它可能與@gervs相同,但謝謝你的支持。你得到了XD – Smeaven 2014-09-24 20:05:52