2015-10-02 47 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),这不是你想要的。 –