mysql数据库查询中的where子句

时间:2014-10-17 10:46:08

标签: mysql sql pivot

表格

+-----------------+------------+--------------+
| submit_time     | field_name | field_value  |
+-----------------+------------+--------------+
| 1410098760.2225 |  cap       |  40128       |
| 1410098760.2225 |  provincia |  Bologna     |
| 1410098760.2225 |  localita  |  Bologna     |
| 1410098760.2225 |  indirizzo |  Via roma    |
| 1410098760.2225 |  zodiaco   |  Pesci       |
| 1410098760.2225 |  anno      |  1964        |
| 1410098760.2225 |  mese      |  03          |
| 1410098760.2225 |  giorno    |  10          |
| 1410098760.2225 |  card      |  12          |
+-----------------+------------+--------------+

这是我的查询,

SELECT 
  submit_time,
  Max(if(field_name = 'nome', field_value, NULL)) AS nome,
  Max(if(field_name = 'giorno', field_value, NULL)) AS giorno,
  Max(if(field_name = 'mese', field_value, NULL)) AS mese,
  Max(if(field_name = 'anno', field_value, NULL)) AS anno,
  Max(if(field_name = 'card', field_value, NULL)) AS card,
  Max(if(field_name = 'localita', field_value, NULL)) AS localita,
  Max(if(field_name = 'indirizzo', field_value, NULL)) AS indirizzo,
  Max(if(field_name = 'email', field_value, NULL)) AS email,
  Max(if(field_name = 'tel', field_value, NULL)) AS tel,
  Max(if(field_name = 'cellulare', field_value, NULL)) AS cellulare    
FROM zhter9mu3cf7dbplugin_submits    
GROUP BY submit_time

这很完美,但如果我使用where子句

where field_name = 'card' and field_value = 12

所有字段都是空的。有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

问题在于,当您使用WHERE子句过滤field_name = 'card' and field_value = 12时,您会返回一行。

您基本上是使用其他field_names删除行。您可以通过对样本数据执行以下操作来查看此内容:

select *
from submits
where field_name = 'card' 
  and field_value = 12

SQL Fiddle with Demo。这仅返回您请求的field_namefield_value的行。其他列中没有其他内容可以返回null。

如果您想要返回与您正在过滤的submit_timefield_name相同的field_value,那么您可以使用:

SELECT 
  submit_time,
  Max(if(field_name = 'nome', field_value, NULL)) AS nome,
  Max(if(field_name = 'giorno', field_value, NULL)) AS giorno,
  Max(if(field_name = 'mese', field_value, NULL)) AS mese,
  Max(if(field_name = 'anno', field_value, NULL)) AS anno,
  Max(if(field_name = 'card', field_value, NULL)) AS card,
  Max(if(field_name = 'localita', field_value, NULL)) AS localita,
  Max(if(field_name = 'indirizzo', field_value, NULL)) AS indirizzo,
  Max(if(field_name = 'email', field_value, NULL)) AS email,
  Max(if(field_name = 'tel', field_value, NULL)) AS tel,
  Max(if(field_name = 'cellulare', field_value, NULL)) AS cellulare    
FROM submits s
WHERE EXISTS (SELECT 1
              FROM submits f
              WHERE f.field_name = 'card' 
                AND f.field_value = '12'
                AND f.submit_time = s.submit_time)
GROUP BY submit_time;

请参阅SQL Fiddle with Demo