2012-04-25 105 views
0

我有一个成功的查询,当前返回除一个表以外的所有数据。最后一个表格包含元数据,它是一对多关系(一个产品,多个包含相关数据的记录)。MySQL将查询结果追加到当前记录?

有没有办法到现场追加了价值的现有查询的末尾,这样我仍然可以用mysql_fetch_array()命令访问PHP记录集?

基本上我想查询的产品ID的任何记录,然后再追加多个附加字段。

想着它其实我在想,如果我可以包括设置(即结果的数组的元数据)和访问,通过PHP的记录中的数组后?

工作查询:

SELECT offers.*, c.short_name AS sponsorName, c.logo AS sponsorLogo 
FROM offers LEFT JOIN sponsors AS c ON c.id=offers.sponsor ORDER BY end_date ASC 

结果:

ID: 43875 
category: 1 
state: CO 
city: Denver 
zip: 80221 
sponsor: 1 
title: The coolest thing ever 
duration: 2 years 
price: 10 
frequency:: Month 

第二查询得到正确的数据 - 元

SELECT mo.`name` AS meta_value FROM offer_metas 
LEFT JOIN meta_options AS mo ON mo.id = offer_metas.meta_option 
WHERE offer_id='48735' ORDER BY meta_option ASC 

结果:

meta_value: 
'5-10 tickets' 
'General Admission' 

我想这两个字段添加到记录上去顶..但不知道如何将查询结果中的所有字段添加到一个已经存在的记录。

--SOLVED--

查询已调整为占GROUP_CONCAT如下

SELECT 
offers.*, 
s.short_name AS sponsorName, 
s.logo AS sponsorLogo, 
GROUP_CONCAT(mn.title) titles, 
GROUP_CONCAT(mo.`name`) metas 
FROM offers 
LEFT JOIN sponsors AS s ON s.id = offers.sponsir 
INNER JOIN offer_metas ON offer_metas.offer_id = offers.id 
INNER JOIN meta_options as mo ON offer_metas.meta_option = mo.id 
INNER JOIN meta_names as mn ON mo.category = mn.category AND mo.cat_seq = mn.seq 
ORDER BY end_date ASC 

数据结果看起来很不错,包括2场名为 “标题” 和 “METAS”看起来像这样

titles: 'Number of Tickets,Purchased Seats' 
metas: '5-10,General Administration' 

现在这些..我可以在PHP中工作..因为他们有相同数量的元素,我只是将它们解析成一个数组,我可以更好地处理:)

+0

我试着做多左联接做到这一点..但它不停地复制产品记录我离开每个加盟“元”价值...试图保持它在一个记录。 – Silvertiger 2012-04-25 15:45:51

+0

我不认为这是可能的;最接近的可能是使用'GROUP_CONCAT'将第二个查询的结果合并为单个记录,然后在PHP中使用相同的分隔符'爆炸'。另一方面,如果第一个查询中的每条记录都在第二条记录中产生了相同数量的记录,那么您可以*将第二条查询转到第一条查询的末尾(尽管由于MySQL没有任何原生支持枢轴转动,这将是一个相当丑陋的手动黑客) - 但你为什么要这样做?现状有什么问题? – eggyal 2012-04-25 15:54:01

+0

主要我想显示在一个表中的结果..我不能设置PHP/HTML的列宽度等,因为有每个元数据的列... :(...如果我拥有它的一切在一条记录中..问题解决了 – Silvertiger 2012-04-25 16:09:07

回答

2

除了上面的注释,它听起来像GROUP_CONCAT()会给你你后。它不会返回meta_values一个数组,而是作为一个字符串(例如,通过<br/>为了分隔每个值,他们可以直接发射为HTML):

SELECT 
    offers.*, 
    c.short_name AS sponsorName, 
    c.logo AS sponsorLogo, 
    GROUP_CONCAT(mo.name ORDER BY meta_option ASC SEPARATOR '<br/>') AS meta_values 
FROM 
    offers 
    LEFT JOIN sponsors  AS c ON c.id  = offers.sponsor 
    LEFT JOIN offer_metas AS o ON o.offer_id = offers.id 
    LEFT JOIN meta_options AS mo ON mo.id  = offer_metas.meta_option 
ORDER BY end_date ASC; 

需要注意的是,如果你需要为它们可能包含的任何HTML转义元值,您需要选择不同的分隔符(可能为U+001E,INFORMATION SEPARATOR TWO?),并让PHP在转义任何包含的HTML后用合适的HTML代替该分隔符。

+0

是的..在做了一些研究后,我有一个最后的工作查询.. ch使数据库变得有点......但是我会将它添加到上面的解决方案中。重要的是,我将采用给定字段的值并将其与PHP分开以获得我的列头代码,然后对数据列执行同样的操作。“精彩”..你们摇滚! – Silvertiger 2012-04-25 16:33:28

+0

我已经添加了我的最终查询和上面的工作结果。 – Silvertiger 2012-04-25 16:40:43