我的表有一个枚举列,可能的值为'relative'和'absolute'。可能有重复的行,区别在于列。
所以通常我会选择一个'绝对'值但我需要的行,如果caluse检查是否有'重复'行,其中列是'relative',然后选择该行(如果有的话)相关的行,总会有绝对的行)
伪代码:
select *
from table
where non_unique_col = 123
and IF (has result row with 'relative'
then return that row
else return 'absolute' row)
答案 0 :(得分:2)
你可以试试这个:
SELECT *
FROM `table`
WHERE `non_unique_col` = 123
ORDER BY `absolute_relative_col` DESC
LIMIT 1
这样,如果只有一个结果,没问题,如果有更多,你得到'亲戚'。
编辑:
根据@Travesty3的建议,我想强调一下,这个查询的假设是(non_unique_col + absolute_relative_col)
生成unique_col
,这是基于OP语句
可能有重复的行,区别在于列
和
如果有相对行,那么总是会有绝对行
编辑2:
更通用的解决方案如下:
SELECT *
FROM `table` as t1
JOIN (
SELECT non_unique_col, absolute_relative_col
FROM `table`
WHERE `absolute_relative_col` = 'relative'
) as t2 USING (non_unique_col)
WHERE t2.absolute_relative_col = 'relative' OR (
t2.absolute_relative_col IS NULL
AND t1.absolute_relative_col = 'absolute'
)
答案 1 :(得分:0)
以下(未经测试的)查询应返回您想要的内容,但与大多数使用子查询的查询一样,我认为它不是非常有效。
SELECT *
FROM `table`
WHERE `non_unique_col`=123
AND (
(`relativity` = 'relative')
OR (`relativity` = 'absolute'
AND NOT EXISTS (
SELECT 1
FROM `table`
WHERE `non_unique_col`=123
AND `relativity`='relative'
)
)
);
编辑:如果你想创建一个这样的列表(例如没有id),那么你会写这样的东西:
SELECT *
FROM `table` as a
WHERE (`relativity` = 'relative')
OR (
`relativity` = 'absolute'
AND NOT EXISTS (
SELECT 1
FROM `table` as b
WHERE a.`non_unique_col`=b.`non_unique_col`
AND `relativity`='relative'
)
);
答案 2 :(得分:0)
SELECT *
FROM table1
INNER JOIN (
SELECT non_unique_col nuc,
MAX(absolute_relative_col) rec
FROM table1
GROUP BY non_unique_col
) AS t ON nuc=non_unique_col AND rec=absolute_relative_col
-- (@Zessx: second condition is still part of the INNER JOIN ...)
修改强>:
但是我喜欢COALESCE的想法(见上面草莓的评论!)好多了:
SELECT * FROM table1 WHERE id IN (
SELECT COALESCE(b.id,a.id) FROM tablel a
LEFT JOIN tbl b ON b.non_unique_col=a.non_unique_col
AND b.absolute_relative_col='relative'
)
答案 3 :(得分:0)
如果行与和相对或绝对部分相同,如果每个non_unique_column值只需要在行上,为什么不简单地使用:
select non_unique_col, max(rel_or_abs), extra_data from tbl
group by non_unique_col;