SELECT * , 1 AS xh
FROM text
WHERE (
id <312
AND  `title` LIKE  '%德国%'
AND  `title` LIKE  '%丹麦%'
)
UNION SELECT * , 2 AS xh
FROM text
WHERE (
id <312
AND  `title` LIKE  '%德国%'
OR  `title` LIKE  '%丹麦%'
)
ORDER BY xh
LIMIT 6

解决方案 »

  1.   

    明确? 我怎么记得用了union all才会有重复? union本身会去掉重复的
      

  2.   

    非常明确啊!!! 我在phpmyadmin 里测试N次了 我想因为用了临时xh的原因吧!
      

  3.   

    1 AS xh
    2 AS xh
    因此总体来说其实是没有重复的。
      

  4.   

    哦, 对的, 那你可以group by 一下啊
      

  5.   

    大概这样, 把.... 换成你的具体的字段, 
    没法试, 有错你调一下就行, 
    不知道你原始需求, 有可能可以找到更简洁的写法, select  ...., group_concat(xh) as cxh
    from 
    (
    SELECT * , 1 AS xh
    FROM text
    WHERE (
    id <312
    AND `title` LIKE '%德国%'
    AND `title` LIKE '%丹麦%'
    )
    UNION SELECT * , 2 AS xh
    FROM text
    WHERE (
    id <312
    AND `title` LIKE '%德国%'
    OR `title` LIKE '%丹麦%'
    )
    ) temp
    group by ....
    where cxh in (1,2)
    ORDER BY cxh
    LIMIT 6
      

  6.   

    集合1都是xh=1,集合2都是xh=2,这是啥意思。
      

  7.   

    猜楼主是要搜索文章, 
    搜"德国 丹麦"的时候, 他要把两个词都包括的放前面, 只含一个的放后面
    不过这样的话, 他那个  
    `title` LIKE '%德国%' OR `title` LIKE '%丹麦%'
    应该加个括号
    (`title` LIKE '%德国%' OR `title` LIKE '%丹麦%')
    要不结果会有问题
      

  8.   

    改成'x''X'.....这么诡异的注意你也能想出来....嗯, 至少要加个注释,要不将来被N个读代码的骂不要怪我.....关于括号: 
    id <312 AND `title` LIKE '%德国%' OR `title` LIKE '%丹麦%'
    相当于 ( id <312 AND `title` LIKE '%德国%' ) OR `title` LIKE '%丹麦%' 这个和
     id <312 AND ( `title` LIKE '%德国%'  OR `title` LIKE '%丹麦%' )
    是不同的, 应该明白了吧, 还不明白加条   有"丹麦"并且 id>312的记录 并且能让它排进前6的话就明白了
      

  9.   

    改成x,X 和用1,2有什么区别吗求解答。union后相同id还是没法去重啊,啥意思。select distinct(id)套在外边不行吗。select distinct(temp.id), xxx, xxx, xxx
    from 
    (SELECT * , 1 AS xh
    FROM text
    WHERE (
    id <312
    AND `title` LIKE '%德国%'
    AND `title` LIKE '%丹麦%'
    )
    UNION SELECT * , 2 AS xh
    FROM text
    WHERE (
    id <312
    AND (`title` LIKE '%德国%'
    OR `title` LIKE '%丹麦%')
    )
    )temp
    ORDER BY temp.xh
    LIMIT 6
      

  10.   

    不至于搞得那么复杂吧?SELECT * , 1 AS xh
    FROM text
    WHERE (
    id <312
    AND `title` LIKE '%德国%'
    AND `title` LIKE '%丹麦%'
    )
    UNION SELECT * , 2 AS xh
    FROM text
    WHERE (
    id <312
    AND (`title` LIKE '%德国%')+(`title` LIKE '%丹麦%') = 1
    ORDER BY xh
    LIMIT 6
      

  11.   


    学习了... 原来症结就在于楼主用or得到的结果和用and的结果集有重合, 改成 (`title` LIKE '%德国%')+(`title` LIKE '%丹麦%') = 1就不会重复了.
      

  12.   

    用x,X是一个比较"巧"的方法,很聪明
    不过别人(或几个月后的你自己)看到这个sql可能会一下子反应不过来.所以要加注释另外,注意这个方法依赖于字段的collation,一定要是大小写无关的.