0

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

主表是 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 脚本,而 PHP 脚本又应该返回一个 XML 文件和所有结果。

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

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

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

提前致谢!

4

2 回答 2

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
于 2012-12-14T14:11:52.187 回答
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

于 2012-12-15T06:24:59.433 回答