长查询中的Mysql变量

长查询中的Mysql变量,mysql,sql,Mysql,Sql,我认为mysql 5.6上的mysql查询中的变量有问题: SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`, '120' AS ttl, `merge_s`.`pri` AS `prio`, (SELECT type FROM types WHERE type = @type:='MX') AS `type`, (S

我认为mysql 5.6上的mysql查询中的变量有问题:

SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`,
            '120' AS ttl,
            `merge_s`.`pri` AS `prio`,
            (SELECT type FROM types WHERE type = @type:='MX') AS `type`,
            (SELECT id FROM soa WHERE CONCAT(SUBSTRING_INDEX((SELECT @rr:='mina.net'),'.',-2),'.')=soa.origin) AS domain_id,
            `merge_s`.`rr` AS `rr`
    FROM (`merge_s` LEFT JOIN `merge_s` `db2` ON
            (((`merge_s`.`rr` = `db2`.`rr`) AND (`merge_s`.`pri` < `db2`.`pri`) and (`merge_s`.`type` = `db2`.`type`))))
    WHERE ((`merge_s`.`status` = '1') OR (`merge_s`.`type` = 'NS') OR (`merge_s`.`type` = 'SOA')) AND
            (isnull(`db2`.`pri`) OR (`merge_s`.`type` = 'MX')) AND
            (merge_s.type=@type AND merge_s.rr=@rr)

你可以把它放在“选择”的顶部

SET @rr:='mina.net';

SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`,
                '120' AS ttl,
                `merge_s`.`pri` AS `prio`,
                (SELECT type FROM types WHERE type = @type:='MX') AS `type`,
                (SELECT id FROM soa WHERE CONCAT(SUBSTRING_INDEX((SELECT @rr:='mina.net'),'.',-2),'.')=soa.origin) AS domain_id,
                `merge_s`.`rr` AS `rr`
        FROM (`merge_s` LEFT JOIN `merge_s` `db2` ON
                (((`merge_s`.`rr` = `db2`.`rr`) AND (`merge_s`.`pri` < `db2`.`pri`) and (`merge_s`.`type` = `db2`.`type`))))
        WHERE ((`merge_s`.`status` = '1') OR (`merge_s`.`type` = 'NS') OR (`merge_s`.`type` = 'SOA')) AND
                (isnull(`db2`.`pri`) OR (`merge_s`.`type` = 'MX')) AND
                (merge_s.type=@type AND merge_s.rr=@rr)

在查询中,将在select子句的子查询中设置变量:


删除交叉联接之前的最后一个以修复语法错误。我不能单独编辑它,因为stackoverflow希望我修复至少7个字符,但这里只有1个字符。在MySQL5.5中,发布的第一个查询是有效的,但在5.6中不再有效。我不知道为什么。你的解决方案,这是一个很好的解决方案。
content         ttl     prio    type    domain_id   rr  
mail.mina.net   120     50       MX       3         mina.net
mail.tes.net    120     60       MX       3         mina.net
SET @rr:='mina.net';

SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`,
                '120' AS ttl,
                `merge_s`.`pri` AS `prio`,
                (SELECT type FROM types WHERE type = @type:='MX') AS `type`,
                (SELECT id FROM soa WHERE CONCAT(SUBSTRING_INDEX((SELECT @rr:='mina.net'),'.',-2),'.')=soa.origin) AS domain_id,
                `merge_s`.`rr` AS `rr`
        FROM (`merge_s` LEFT JOIN `merge_s` `db2` ON
                (((`merge_s`.`rr` = `db2`.`rr`) AND (`merge_s`.`pri` < `db2`.`pri`) and (`merge_s`.`type` = `db2`.`type`))))
        WHERE ((`merge_s`.`status` = '1') OR (`merge_s`.`type` = 'NS') OR (`merge_s`.`type` = 'SOA')) AND
                (isnull(`db2`.`pri`) OR (`merge_s`.`type` = 'MX')) AND
                (merge_s.type=@type AND merge_s.rr=@rr)
SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`,
       '120' AS ttl, `merge_s`.`pri` AS `prio`,
        (SELECT type FROM types WHERE type = @type:='MX') AS `type`,
        (SELECT id
         FROM soa
         WHERE CONCAT(SUBSTRING_INDEX((SELECT @rr:='mina.net'),'.',-2),'.')=soa.origin
        ) AS domain_id,
        `merge_s`.`rr` AS `rr`
FROM `merge_s` LEFT JOIN
     `merge_s` `db2`
      ON(((`merge_s`.`rr` = `db2`.`rr`) AND (`merge_s`.`pri` < `db2`.`pri`) and (`merge_s`.`type` = `db2`.`type`))))
WHERE ((`merge_s`.`status` = '1') OR (`merge_s`.`type` = 'NS') OR (`merge_s`.`type` = 'SOA')) AND
      (isnull(`db2`.`pri`) OR (`merge_s`.`type` = 'MX')) AND
      (merge_s.type=@type AND merge_s.rr=@rr);
SELECT DISTINCT TRIM(TRAILING '.' FROM merge_s.rdata) AS `content`,
       '120' AS ttl, `merge_s`.`pri` AS `prio`,
        (SELECT type FROM types WHERE type = @type) AS `type`,
        (SELECT id
         FROM soa
         WHERE CONCAT(SUBSTRING_INDEX( @rr,'.',-2),'.')=soa.origin
        ) AS domain_id,
        `merge_s`.`rr` AS `rr`
FROM `merge_s` LEFT JOIN
     `merge_s` `db2`
      ON(((`merge_s`.`rr` = `db2`.`rr`) AND (`merge_s`.`pri` < `db2`.`pri`) and
          (`merge_s`.`type` = `db2`.`type`)))) cross join
      (select @type:='MX', @rr:='mina.net') const
WHERE ((`merge_s`.`status` = '1') OR (`merge_s`.`type` = 'NS') OR (`merge_s`.`type` = 'SOA')) AND
      (isnull(`db2`.`pri`) OR (`merge_s`.`type` = 'MX')) AND
      (merge_s.type=@type AND merge_s.rr=@rr);