Mysql 无法组合三个SELECT语句,UNION不起作用

Mysql 无法组合三个SELECT语句,UNION不起作用,mysql,sql,database,select,union,Mysql,Sql,Database,Select,Union,我在组合三个select语句时遇到了巨大的困难,我尝试了union它不起作用,因为单独的select语句确实起作用,但是我需要将其余语句变成一个swift语句,如果可能的话,甚至可以将最终记录以随机顺序排列 SELECT DISTINCT email FROM customer_1_tbl WHERE email NOT IN (SELECT temp.email FROM temp_emails AS

我在组合三个select语句时遇到了巨大的困难,我尝试了union它不起作用,因为单独的select语句确实起作用,但是我需要将其余语句变成一个swift语句,如果可能的话,甚至可以将最终记录以随机顺序排列

      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

如果在每个查询中都需要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

为了对部分查询而不是整个查询使用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
)

在您的查询结束时按顺序排序。然后我的问题是前两次选择的实际记录将始终相同。所以每次我都需要随机得到6个与union不起作用的值?在我的脚本中,它不运行,返回布尔值false。如果我删除order by rand,它可以工作,但是我需要select中的6条记录是随机的。难道你不能将所有内容都合并到一个查询中吗?ORing WHERE子句的最后部分&像现在这样从单个查询中获取6个随机值。使用括号是不够的。谢谢,这确实有效,你介意解释一下你的工作原理吗?我可以看到你添加的内容。不过,我是一个初学者,我想更确切地理解你的工作原理。洛拉如前所述,我只是在你的查询中添加了括号。如果没有它们,则不能使用ORDER BY和LIMIT per partial query;整个查询可能只有一个ORDER BY和LIMIT,这不是您想要的。顺便说一句:由于三个部分查询检索到的电子邮件因WHERE子句的不同而不同,因此让DBMS查找重复的邮件是没有意义的,UNION就是这么做的。改为使用UNIONALL,以节省dbms的额外工作。