SQL UNION重复的问题与多个AS语句

SQL UNION重复的问题与多个AS语句

问题描述:

使用下面的SQL查询:SQL UNION重复的问题与多个AS语句

SELECT id, title, description, publisher, 
     city, state, date, 
     MATCH (title, description, publisher) AGAINST ('pizza+view' IN BOOLEAN MODE) AS score 
    FROM job 
    HAVING score > 0.01 
    UNION 
    SELECT id, title, description, publisher, 
     city, state, date, (3959 * acos(cos(radians('37')) * cos(radians(latitude)) * cos(radians(longitude) - radians('-122')) + sin(radians('37')) * sin(radians(latitude)))) AS distance 
    FROM job 
    HAVING distance < '175' 
ORDER BY distance DESC 
    LIMIT 0, 30 

结果回来为:

id title description publisher city state date distance 

比分被送回距离,因此没有独特的行。

我该如何改变这种情况?

+1

'UNION'要求在所有UNIONed查询中列数相同,并且数据类型在每个位置匹配。 – 2012-02-17 05:32:38

+0

结果列的名称将取自UNION中的第一个SELECT; _primus inter pares_也在这里工作。也许你打算做某种连接而不是工会?至少,如果您想要某些行的分数以及其他分数的距离,那么您有一些关于如何对查询进行短语的思考。这可能是因为你将UNION作为子查询来识别有趣的工作,然后对每一个有趣的工作,在最终结果查询中计算(重新?)距离和得分。 – 2012-02-17 05:47:34

+0

考虑在第一个UNION的表表达式中添加'distance'的默认值,并在第二个表中添加'score'的默认值。 – onedaywhen 2012-02-17 08:18:39

尝试使用CTE作为第一条语句。 事情是这样的:

WITH score as ( SELECT id, title, description, publisher, 
    city, state, date, 
    MATCH (title, description, publisher) AGAINST ('pizza+view' IN BOOLEAN MODE) AS score 
FROM job 
HAVING score > 0.01) 

SELECT j.id, j.title, j.description, j.publisher, 
    j.city, j.state, j.date, (3959 * acos(cos(radians('37')) * cos(radians(latitude)) 
    *  cos(radians(longitude) - radians('-122')) + sin(radians('37')) * sin( 
radians (latitude)))) AS distance, s.score 
FROM job j 
LEFT OUTER JOIN score s ON s.ID = j.ID 
HAVING j.distance < '175' 
ORDER BY distance DESC 
LIMIT 0, 30 

我会使用子查询和无序结果按分数和距离字段,以便用同样的比分行将通过距离进行排序。我从最终结果集中删除了分数列,我不确定在这种情况下是否需要它。

select id, title, description, publisher, city, state, date from (
    SELECT 
     id, title, description, publisher, city, state, date, 
     MATCH (title, description, publisher) AGAINST ('pizza+view' IN BOOLEAN MODE) AS score, 
     (3959 * acos(cos(radians('37')) * cos(radians(latitude)) * cos(radians(longitude) - radians('-122')) + sin(radians('37')) * sin(radians(latitude)))) AS distance 
    FROM job 
) t 
where score > 0.01 or distance < 175 
order by score desc, distance desc 
limit 0, 30