0

次のクエリをcsvとして出力する必要があります。

group_concat列から列に行を転置するphpロジックを簡単に記述できます

ただし、データベースにできるだけ多くのデータ部分を保持し、php側での操作を最小限に抑えることに熱心です。

クエリのgroup_concatの下にある2つの列を試しています。

問題は、life_stage列の存在量の値も返されることです。group_concatキー値を操作する以外にこれを回避する方法がない場合は、それで問題ありません。再確認したかっただけです。前もって感謝します

SELECT 
`tr`.`tr_id_pk` as 'RecordKey',
`t`.`tax_name` as `TaxonName`,
`tr`.`tr_date` as 'Date',
`s`.`si_name` as 'SiteName',
`tr`.`tr_grid_reference` as 'GridReference',
`tr`.`tr_is_site_grid` as 'IsSiteGrid',
`r`.`rec_name` as 'Recorder',
`r`.`rec_email` as 'RecorderEmail',
`tr`.`tr_comment` as 'RecordComment',
`tr`.`tr_last_update` as 'LastUpdated',
`tr`.`tr_form_key` as 'FormKey',
`c`.`co_name` as 'County',
`vc`.`vc_name` as 'ViceCounty',
`h`.`hab_name` as 'Habitat',
GROUP_CONCAT(DISTINCT CONCAT_WS('=', `ra`.`ra_name`, `rad`.`rad_value`)) as 'RecordAttributeKeyValuePairs',
`rad`.`rad_value` AS `abundance`,
`rad`.`rad_value` AS `life_stage`
FROM
`taxon_record`as `tr`
    INNER JOIN
`taxon`as `t` ON `tr`.`tax_id_fk` = `t`.`tax_id_pk`
    INNER JOIN
`recorder`as `r` ON `tr`.`rec_id_fk` = `r`.`rec_id_pk`
    INNER JOIN
`site`as `s` ON `tr`.`si_id_fk` = `s`.`si_id_pk`
    LEFT JOIN
`county`as `c` ON `tr`.`co_id_fk` = `c`.`co_id_pk`
    LEFT JOIN
`vice_county`as `vc` ON `tr`.`vc_id_fk` = `vc`.`vc_id_pk`
    LEFT JOIN
`habitat`as `h` ON `tr`.`hab_id_fk` = `h`.`hab_id_pk`
    LEFT JOIN
(`record_attribute_data`as `rad`
INNER JOIN `record_attribute`as `ra` ON (`rad`.`ra_id_fk` = `ra`.`ra_id_pk`)) ON (`tr`.`tr_id_pk` = `rad`.`tr_id_fk`)
WHERE
`r`.`rec_email` = 'some_email@somewhere.com'
GROUP BY `tr`.`tr_id_pk`; 
4

2 に答える 2

0

同じ列を異なる名前で2回フェッチしているという問題はありますか?:

`rad`.`rad_value` AS `abundance`,
`rad`.`rad_value` AS `life_stage`

そうすれば、豊かさとlife_stageについて常に同じことが得られるようです。

于 2012-05-02T10:17:15.520 に答える
0

あなたがやりたいことは、データの「ピボット」と呼ばれ、他のRDBMSがネイティブでサポートしているものですが、MySQLはサポートしていません(開発者はそのような操作はプレゼンテーション層に属すると感じているため、設計上)。

ただし、ほのめかしたように、かなり恐ろしいMySQLクエリを作成して、ピボット操作を手動で実行できます(出力列ごとに属性テーブルをクエリに1回結合する必要があります)。

SELECT tr.tr_id_pk, abundance, life_stage -- etc.
  FROM taxon_record AS tr
  LEFT JOIN (
    SELECT rad.tr_id_fk, rad.rad_value AS abundance
    FROM
      record_attribute_data ra JOIN record_attribute rad
        ON rad.ra_id_fk = ra.ra_id_pk
    WHERE ra.ra_name = 'abundance'
  ) AS tAbundance ON tAbundance.tr_id_fk = tr.tr_id_pk
  LEFT JOIN (
    SELECT rad.tr_id_fk, rad.rad_value AS life_stage
    FROM
      record_attribute_data ra JOIN record_attribute rad
        ON rad.ra_id_fk = ra.ra_id_pk
    WHERE ra.ra_name = 'life_stage'
  ) AS tLife_Stage ON tLife_Stage.tr_id_fk = tr.tr_id_pk
  -- etc.

このパスを選択する場合は、PHPのループ構造またはMySQLのプリペアドステートメントのいずれかを使用してこのクエリを生成することで、作業を少し楽にすることができます。

于 2012-05-02T10:17:24.567 に答える