0

我继承了这个非常大且架构不佳的解决方案,需要编写/运行一些大而笨拙的查询。

虽然下面的查询有效并为我提供了我想要的结果,但每个选择提供帮助的志愿者的列表并未标记为测试,并且关联的用户帐户标记为“活动”。然后是一组额外的列,一个用于 5 个社交媒体平台中的每一个(但它也可以很容易地成为技能列表或任何东西)

SELECT v.volunteerid
      , v.firstname
      , v.lastname
      , v.mobile
      , v.phone
      , v.email
      , v.has_smartphone
      , MAX(case vs.socialid when '1' then 'Yes' else 'No' end) Facebook
      , MAX(case vs.socialid when '2' then 'Yes' else 'No' end) Twitter
      , MAX(case vs.socialid when '3' then 'Yes' else 'No' end) Instagram 
      , MAX(case vs.socialid when '4' then 'Yes' else 'No' end) Vine
      , MAX(case vs.socialid when '5' then 'Yes' else 'No' end) Google+
FROM wp_cfg_volunteer v
LEFT OUTER JOIN appusers u 
     ON u.volunteerid = v.volunteerid
LEFT OUTER JOIN wp_cfg_volunteer_social vs 
     ON vs.volunteerid = v.volunteerid
WHERE v.is_test=0
AND v.will_help=1
AND u.activationstate='Active'
GROUP BY v.volunteerid

我的问题是:我怎样才能使社交平台查找查询基于,这样socialid我就可以编写一个循环遍历wp_cfg_social表的查询,而不是硬编码值和它们的关联名称,拉出 id 和 name 值?

对于奖励积分:什么是掌握 mysql 查询的进出的好资源。

谢谢,
nbsp

4

1 回答 1

0

你应该有一个单独的表,比如说你提到wp_cfg_social的至少有两个字段,即socialid和可能socialname。并确保它socialid的值从1 到 5。鉴于此,您可以使用INNER JOIN来显示这些socialname值,而无需进行硬编码,例如:

SELECT v.volunteerid
  , v.firstname
  , v.lastname
  , v.mobile
  , v.phone
  , v.email
  , v.has_smartphone
  , s.socialname
FROM wp_cfg_volunteer v
LEFT OUTER JOIN appusers u 
ON u.volunteerid = v.volunteerid
LEFT OUTER JOIN wp_cfg_volunteer_social vs 
ON vs.volunteerid = v.volunteerid
INNER JOIN wp_cfg_social s
ON v.socialid = s.socialid
WHERE v.is_test=0
AND v.will_help=1
AND u.activationstate='Active'
GROUP BY v.volunteerid

至于您关于 mysql 查询的第二个问题,您可以访问以下链接:

教程点
Dev mySQL作为您的一般参考
规范化学习规范化作为数据库设计的基础也很好

于 2013-08-12T05:31:16.833 回答