高级mysql查询,一次从多个表和行中获取。加入?

时间:2012-12-14 14:05:21

标签: php mysql sql

我目前正在开展一个项目,我将信息存储在几个表中,这些表都相互连接。我相信表格和列格式是合乎逻辑的,也是最佳选择。但问题是,我没有足够的知识来构建足够高级的查询来获取我需要的所有信息。

主表是ab_ads,其中存储了广告。这些广告可以分配多种格式(即250x360,980x120等),您也可以选择他们应该展示的区域(即斯科讷,斯德哥尔摩,卡尔马,达拉纳,耶姆特兰等)。

这就是我存储数据的方式。我没有显示所有表格,但我希望这已经足够了。

广告栏(ab_ads):(列数较多但不相关)

ID    orgnum         company_name   title           content         link
1     556664-7524    Company Inc    Lorem ipsum     Lorem ipsum     URL

广告状态(ab_ads_states):

ID    adID    stateID
1     1       2             // Skåne
2     1       5             // Kalmar
3     1       8             // Stockholm
4     1       10            // Värmland
5     2       2             // Skåne
6     2       5             // Kalmar
7     3       8             // Stockholm
8     4       10            // Värmland

广告格式(ab_ads_formats)

ID    adID    formatID
1     1       1             // 250x360
2     1       2             // 980x120
3     2       1             // 250x360
4     3       2             // 980x120

格式表(ab_formats)

ID    name        width    height
1     Format 1    250      360
2     Format 2    980      120

所以,我有两个flash横幅,它们都应该调用一个PHP脚本,而这个脚本本来应该提供一个带有所有结果的XML文件。

我知道如何从不同的表中选择数据,但我从未尝试过从另一个表中选择多行并将它们合并为一个,我想这是我需要在这里做的。我非常感谢能得到的任何帮助。

Flash横幅会向PHP文件stateIDformatID发送两个参数。这意味着我必须SELECT ad WHERE state = param AND format = format。但由于我为广告状态存储了多个条目,我不知道该怎么做。

修改 我还想在查询中获取格式名称,并使用以下格式获取它们:“Format 1,Format 2”在名为“formats”的列中。我想这需要某种加入?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为这会奏效:

select ab.name as formats, aa.* from ab_ads as aa
inner join ab_ads_states as aas on aa.id = aas.adid and aas.stateId = stateIdParam
inner join ab_ads_formats as aaf on aa.id = aaf.adid and aaf.formatId = formatIdParam
inner join ab_formats as ab on aaf.formatid = ab.id

编辑: 我对mySql不是很了解,也没有任何东西可以测试它,但我认为group_concat可能就是你要找的东西。如果是这样,它可能看起来像这样:

select group_concat(ab.name separator ", ") as formats from ab_ads aa
inner join ab_ads_states as aas on aa.id = aas.adid and aas.stateId = 2
inner join ab_ads_formats as aaf on aa.id = aaf.adid and aaf.formatId in(1,2)
inner join ab_formats as ab on aaf.formatid = ab.id
group by ab.id

答案 1 :(得分:0)

请尝试以下SQL:

SELECT count(aaf.ID) AS TotalFormat,
   group_concat(ab.name) AS formats
FROM ab_ads aa
INNER JOIN ab_ads_states AS aas ON aa.ID = aas.adID
AND aas.stateID = 2
INNER JOIN ab_ads_formats AS aaf ON aa.id = aaf.adID
AND aaf.formatID in(1,2)
INNER JOIN ab_formats AS ab ON aaf.formatID = ab.ID
GROUP BY aaf.adID HAVING TotalFormat >=2

SQL演示:http://sqlfiddle.com/#!2/9f0ab/10