我目前正在开展一个项目,我将信息存储在几个表中,这些表都相互连接。我相信表格和列格式是合乎逻辑的,也是最佳选择。但问题是,我没有足够的知识来构建足够高级的查询来获取我需要的所有信息。
主表是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文件stateID
和formatID
发送两个参数。这意味着我必须SELECT ad WHERE state = param AND format = format
。但由于我为广告状态存储了多个条目,我不知道该怎么做。
修改 我还想在查询中获取格式名称,并使用以下格式获取它们:“Format 1,Format 2”在名为“formats”的列中。我想这需要某种加入?
提前致谢!
答案 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