2017-07-06 31 views
2

我正在尝试一个mysql联盟,但没有任何返回?下面是一个例子。总计有16个select查询MySQL联合不工作

$url_array = array(
    "euro-gbp","euro-aud","euro-usd", 
    "euro-jpy","gbp-jpy","euro-cad", 
    "usd-cad","usd-jpy","cad-jpy", 
    "gbp-usd","aud-usd","gbp-cad", 
    "aud-cad","aud-jpy","aud-nzd", 
    "euro-nzd","gbp-aud","gbp-nzd", 
    "nzd-usd","nzd-cad","nzd-jpy"); 

foreach($url_array as $urls) { 
    $sql[]= "SELECT * 
    FROM `data_analysis_child` 
    WHERE type='".$urls."' 
    ORDER BY id DESC 
    LIMIT 2"; 

} 

$sql = implode(" UNION ",$sql); 

SQL结果

SELECT * FROM `data_analysis_child` WHERE type='euro-gbp' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='euro-aud' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='euro-usd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='euro-jpy' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='gbp-jpy' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='euro-cad' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='usd-cad' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='usd-jpy' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='cad-jpy' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='gbp-usd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='aud-usd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='gbp-cad' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='aud-cad' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='aud-jpy' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='aud-nzd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='euro-nzd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='gbp-aud' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='gbp-nzd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='nzd-usd' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='nzd-cad' ORDER BY id DESC LIMIT 2 UNION SELECT * FROM `data_analysis_child` WHERE type='nzd-jpy' ORDER BY id DESC LIMIT 2 

我该怎么解决?有没有更好的方法来重组这个查询?

+0

如果没有返回任何内容,那么你没有记录的类型匹配你的where子句条件。运行一些没有联合的查询,你会得到结果吗?看起来你想要定义每种类型的两个最新记录。那是对的吗?如果是这样,你可以使用用户变量来模拟一个rowNumber(),并只写一个带有子查询的查询来获得结果。你确定类型没有空格或其他字符?单个查询是否返回2条记录? – xQbert

+0

是的,当我单独运行查询时,我得到结果 – mdnba50

+0

检查编辑..这是我如何构建查询。 – mdnba50

回答

2

如果你需要秩序和限制每个选择,你应该使用()围绕每一个选择

foreach($url_array as $urls) { 
     $sql[]= " ( SELECT * FROM `data_analysis_child` WHERE type='".$urls."' ORDER BY id DESC LIMIT 2 )"; 
     break; 
    } 
+0

当使用限制时,请按顺序排列。 – xQbert

+0

@xQbert正确..(是一个拒绝)..答案更新..非常感谢您的建议 – scaisEdge

+0

@scasisEdge您的更新似乎关闭...顺序由id desc限制2应该=是工会? – xQbert

0

你可以这样做:

SELECT * 
FROM (
    SELECT @rank := if (@last_type=type, @rank+1, 1) as type_rank, * 
    FROM data_analysis_child 
    WHERE type IN ('euro-gbp', 'euro-aud', 'euro-usd'....) 
    ORDER BY id DESC 
) 
WHERE type_rank<=2; 

但性能会吸。

根据指标如何配置和假设你的id列是唯一的,这可能是更好的:

SELECT 'first', dac1.* 
FROM data_analysis_child dac1 
WHERE dac1.id IN (
    SELECT MAX(dac2.id) 
    FROM data_analysis_child dac2 
    WHERE dac2.type IN ('euro-gbp', 'euro-aud', 'euro-usd'....) 
    GROUP BY dac2.type 
) 
UNION 
SELECT 'second', dac3.* 
FROM data_analysis_child dac3 
WHERE dac3.id IN (
    SELECT MAX(dac4.id) 
    FROM data_analysis_child dac4 
    WHERE dac4.type IN ('euro-gbp', 'euro-aud', 'euro-usd'....) 
    AND dac4.id NOT IN (
     SELECT MAX(dac5.id) 
     FROM data_analysis_child dac5 
     WHERE dac5.type IN ('euro-gbp', 'euro-aud', 'euro-usd'....) 
     GROUP BY dac5.type 
    ) 
    GROUP BY dac4.type 
) 

但它不能很好地扩展,以获得最高的N值每种类型。

更好的解决方案是将第一或第二等级的状态标记为记录上的属性并直接过滤。

0

UNION的文件清楚地解释:

申请ORDER BYLIMIT到个人SELECT,放在括号内的条款,封闭SELECT

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 

它还说, :

注意

先前版本的MySQL可能允许这些没有括号的语句。在MySQL 5.7中,强制执行括号的要求。

如果您正在使用MySQL 5.7或更新版本,代码不会返回任何内容,因为查询无法运行。您应该检查返回值的类型(查询无效时查询功能返回FALSE)和错误消息。