使用where语句

时间:2016-11-03 14:17:03

标签: php mysql select doctrine distinct

我想为每列选择一次可用条目。

解决了这个问题
SELECT DISTINCT a from my_table
UNION
SELECT DISTINCT b from my_table
UNION
SELECT DISTINCT c from my_table
UNION
SELECT DISTINCT d from my_table

在这个问题中:MySQL SELECT DISTINCT multiple columns

我想更进一步,在每个子查询上使用相同的 WHERE语句。有没有办法没有每次定义WHERE?我当前的查询看起来像这样:

SELECT DISTINCT a from my_table WHERE a='a' AND b=1 AND c='.' AND d='ab'
UNION
SELECT DISTINCT b from my_table WHERE a='a' AND b=1 AND c='.' AND d='ab'
UNION
SELECT DISTINCT c from my_table WHERE a='a' AND b=1 AND c='.' AND d='ab'
UNION
SELECT DISTINCT d from my_table WHERE a='a' AND b=1 AND c='.' AND d='ab'

不必给出所有参数,我只想显示必须达到的最大值。有没有办法写这个更短的?

如果有任何帮助,我会将PHP与教条一起使用。

提前致谢!

实施例: MY_TABLE:

  a  |  b  |  c  |  d  
-----+-----+-----+-----
  a  |  0  |  .  | ab
  b  |  0  |  -  | ag
  a  |  1  |  .  | cfd
  c  |  1  |  .  | b
  a  |  1  |  -  | ab
  c  |  1  |  -  | cfd

应该给出这个结果(没有where语句):

  a  |  b  |  c  |  d  
-----+-----+-----+-----
  a  |  0  |  .  | ab
  b  |  1  |  -  | ag
  c  |     |     | cfd
     |     |     |  b

并使用WHERE b=0声明:

  a  |  b  |  c  |  d  
-----+-----+-----+-----
  a  |  0  |  .  | ab
  b  |     |  -  | ag

编辑:将子查询更改为UNION,并使数据类型适合示例

1 个答案:

答案 0 :(得分:1)

更新:嗯,我最初为这个问题编写了一个通用的SQL解决方案,没有意识到MySQL显然不允许它。

因此,如果您可以创建视图,那么这可能是最轻量级的解决方案。 (视图的定义查询与原始解决方案的select子句中的with相同。)

或者,您可以创建一个临时表。如果有太多数据,可能需要更多的资源,但是任何人都不太可能限制所需的权限。

对于记录,原始解决方案如下:

with my_filtered as (
    select *
      from my_table
     where a = 1 and b = 2 -- and ...
)
-- carry on with your query, using my_filtered instead of my_table