2012-04-25 9 views
0

私は現在、1つのテーブルを除くすべてのデータを返す正常なクエリを持っています。最後の表には、1対多の関係(1つのプロダクト、関連するデータを持つ複数のレコード)であるメタデータが含まれています。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 

2番目のクエリ権メタデータ - を取得

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' 

私はトップまでのレコードにこれらの二つのフィールドを追加したい..しかし、単一の既存のレコードにクエリ結果内のすべてのフィールドを追加する方法がわかりません。

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つのフィールドを含む、良いを見て、次のように

--SOLVED--

クエリがGROUP_CONCATを考慮して調整されてきた "メタ情報"このように見えるのは

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

今はTHOSE ..私はPHPで動くことができます。そして、彼らは要素の数が同じであるので、配列で解析してよりうまくいくでしょう:)

+0

これを達成するために複数の左結合を試みましたが、結合した各「メタ」値の製品レコードを複製していました... 1つのレコードに保持しようとしました。 – Silvertiger

+0

これは可能だとは思わない。一番近いのは 'GROUP_CONCAT'を使用して2番目のクエリの結果を1つのレコードに結合し、PHPで同じ区切り文字で' explode'することです。一方、最初のクエリのすべてのレコードが2番目のクエリで同じ数のレコードを生成する場合、2番目のクエリを最初のクエリの最後にピボットすることができます(ただし、MySQLにはネイティブサポートがありませんピボットする、これはむしろ醜い手動のハックでなければなりません) - しかし、なぜこれをしたいですか?現状の何が問題なの? – eggyal

+0

主に私はテーブルに結果を表示したいと思います。カラムの幅などのためにphp/htmlを設定することはできません。それぞれのメタデータの列があるからです。 – Silvertiger

答えて

2

上記のコメントに加えてGROUP_CONCAT()のように、あなたが何をしているのかを教えてくれます。これは、配列としてではなく、(例えば、それらは、HTMLとして直接放射することができるようにするために、<br/>で区切られたそれぞれの値を持つ)文字列としてmeta_valuesを返しません。

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; 

注意必要であれば、ということ別のセパレータ(おそらくU+001EINFORMATION SEPARATOR TWO?)を選択し、含まれているHTMLをエスケープした後、適切なHTMLにその区切り文字を置き換える必要があります。

+0

ええ..私は最終的な作業のクエリを持ってreseachのビットを行った後.. chデータベースを少し作成しましたが、上記の私のソリューションに追加します。面白いことに、私は与えられたフィールドの値をとり、PHPで分割してカラムのnheadersを取得し、データカラムにも同じ処理を行います。 – Silvertiger

+0

私は最後のクエリと上記の作業結果を追加しました。 – Silvertiger

関連する問題