2015-10-02 49 views
0

將三個select語句組合在一起時遇到了很大的麻煩,我嘗試過union不起作用,因爲它們可以工作的單獨select語句但是我需要將其餘部分作爲一個swift語句,if可能的,即使把最後的記錄以隨機順序結合三個SELECT語句時遇到問題,UNION不工作

 SELECT DISTINCT email 
     FROM customer_1_tbl 
     WHERE email NOT IN (SELECT temp.email 
          FROM temp_emails AS temp) 
     AND substring_index(email, '@', -1) = 'seznam.cz' 
     ORDER BY RAND() 
     LIMIT 6 

     UNION 

     SELECT DISTINCT email 
     FROM customer_1_tbl 
     WHERE email NOT IN (SELECT temp.email 
          FROM temp_emails AS temp)  
     AND substring_index(email, '@', -1) = 'gmail.com' 
     ORDER BY RAND() 
     LIMIT 6 

     UNION 

     SELECT DISTINCT email 
     FROM customer_1_tbl 
     WHERE email NOT IN (SELECT temp.email 
          FROM temp_emails AS temp) 
     AND substring_index(email, '@', -1) != 'gmail.com' 
     AND substring_index(email, '@', -1) != 'seznam.cz' 
     AND RAND() < (SELECT ((6/COUNT(*))*10) 
         FROM customer_1_tbl) 
     ORDER BY RAND() 
     LIMIT 6 
+0

將ORDER BY放入查詢結尾。 – RubahMalam

+0

我接下來的問題是前兩個選擇的實際記錄將始終是相同的。所以我需要每次隨機獲得6個 –

+0

這對工會不起作用嗎? – PaulF

回答

0

如果需要ORDER BY在每個查詢,那麼試試這個:

SELECT * FROM(
    SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
             FROM temp_emails AS temp) 
    AND substring_index(email, '@', -1) = 'seznam.cz' 
    ORDER BY RAND() 
    LIMIT 6 
) AS A 

UNION 

SELECT * FROM (
    SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
             FROM temp_emails AS temp)  
    AND substring_index(email, '@', -1) = 'gmail.com' 
    ORDER BY RAND() 
    LIMIT 6 
) AS B 

UNION 
SELECT * FROM (
    SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
             FROM temp_emails AS temp) 
    AND substring_index(email, '@', -1) != 'gmail.com' 
    AND substring_index(email, '@', -1) != 'seznam.cz' 
    AND RAND() < (SELECT ((6/COUNT(*))*10) 
           FROM customer_1_tbl) 
    ORDER BY RAND() 
    LIMIT 6 
) AS C 
0

爲了對部分查詢使用ORDER BY子句,而總體而言,使用括號:

(
SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
         FROM temp_emails AS temp) 
    AND substring_index(email, '@', -1) = 'seznam.cz' 
    ORDER BY RAND() 
    LIMIT 6 
) 
    UNION 
(
    SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
         FROM temp_emails AS temp)  
    AND substring_index(email, '@', -1) = 'gmail.com' 
    ORDER BY RAND() 
    LIMIT 6 
) 
    UNION 
(
    SELECT DISTINCT email 
    FROM customer_1_tbl 
    WHERE email NOT IN (SELECT temp.email 
         FROM temp_emails AS temp) 
    AND substring_index(email, '@', -1) != 'gmail.com' 
    AND substring_index(email, '@', -1) != 'seznam.cz' 
    AND RAND() < (SELECT ((6/COUNT(*))*10) 
        FROM customer_1_tbl) 
    ORDER BY RAND() 
    LIMIT 6 
) 
+0

使用'括號'是不夠的。 – RubahMalam

+0

謝謝你的工作,你介意解釋你是什麼做的工作我可以看到你添加了什麼,但是我是一個初學者,我想更牢固地掌握你爲什麼工作大聲笑 –

+0

如上所述,我只在你的查詢中添加括號。沒有它們,你不能對每個部分查詢使用ORDER BY(和LIMIT);那麼對於整個查詢可能只有一個ORDER BY(和LIMIT),這不是你想要的。 –