0

現在、1つのテーブルを除くすべてのデータを返すクエリが成功しました。最後のテーブルには、1対多の関係(1つの製品、関連データを含む複数のレコード)のメタデータが含まれています。

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'

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

-解決済み--

クエリは、次のように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つのフィールドを含むデータ結果は良好に見えました

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

これで、PHPで作業できます..同じ数の要素があるので、それらを配列に解析して、より適切に作業できます:)

4

1 に答える 1

2

GROUP_CONCAT()上記のコメントに加えて、それはあなたが求めているものをあなたに与えるように聞こえます。は配列としてではなく、文字列として返されます(たとえば、HTMLとして直接出力できるように、meta_values各値はで区切られます)。<br/>

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)を選択し、含まれているHTMLをエスケープした後、PHPにその区切り文字を適切なHTMLに置き換える必要があることに注意してください。

于 2012-04-25T16:19:59.300 に答える