手続き的に生成されたこの大規模な MySQL クエリがあります。このクエリの一部で、サーバー セルを 1 つのセルに結合する必要があります。これは、その人が複数のフォーム エントリを持っている可能性があるためです (与えられた同じデータの場合、車、家、自転車、ベビーカー)。GROUP_CONCAT を使用して、それぞれが分離された 1 つのフィールドにすることができます。これはかなりうまく機能しますが、問題があります。
すべての情報が記入されていない人もいます。たとえば、車を例にとると、車は 3 台ありますが、1 台には写真があり、たまたま 3 台目です。だから私はすべての結果ですが、元の順序ではありません
私がテーブルに持っているもの
ID 番号 | 所有者ID# | 作る | モデル | 年 | 写真 --+---------+---------+-----------+------+----- -------- 1 | 3 | 花冠 | gt-s | 1986年 | 2 | 3 | フィット | V6 | 2001年 | 3 | 3 | スターレット | GT | 1981年 | 車.jpg 4 | 4 | F-150 | スーパーデューティ | 2010年 | 5 | 5 | カブトムシ | | | 1968年 |
GROUP_CONCAT クエリを実行すると、これが表示されます
ID 番号 | 所有者ID# | 作る | モデル | 年 | 写真 --+---------+---------------------+------------ +------------+----------------- 1 | 3,3,3 | 花冠、フィット、スターレット | gt-s、V6、GT | 1986,2001,1981 | 車.jpg 4 | 4 | F-150 | スーパーデューティ | 2010年 | 5 | 5 | カブトムシ | | | 1968年 |
しかし、私はこれを手に入れたい
ID 番号 | 所有者ID# | 作る | モデル | 年 | 写真 --+---------+---------------------+------------ +------------+----------------- 1 | 3,3,3 | 花冠、フィット、スターレット | gt-s、V6、GT | 1986,2001,1981 | ,,car.jpg 4 | 4 | F-150 | スーパーデューティ | 2010年 | 5 | 5 | カブトムシ | | | 1968年 |
「carimage.jpg」の from にある 2 つのコンマに注意してください。
問題は、クエリの最初の部分に集中しているようSELECT GROUP_CONCAT(cfv.value) FROM cf_customfield_values cfv
です。必要な方法で動作させるために、いくつかのことを試しました。
GROUP_CONCAT 内で IFNULL を使用して null 値を別のものに変更する IFNULL を
少し動かして、より良い結果が得られるかどうかを確認
する 従来の IF ステートメントを使用して null を別のものに変更する
COALESCE を使用して、少なくとも 1 つの非値が常に存在するようにするNULL
文字列を値の先頭および/または末尾に連結して、常に文字列が含まれているため NULL
ではないようにしましたそこにあるものは、それが NULL であることを認識し、それを連結しません。
これを本当に実行したい理由は、連結された値を表示用のサブテーブルに分割できるようにするためです (明らかに、表示スクリプト部分で起こりうる問題を防ぐために、コンマ以外のものを使用します)。
うわー、それは私よりも長かったですが、TLDR; null を値と同じように連結するには、GROUP_CONCAT が必要です。
完全な SQL
SELECT *, pregi.ttl AS 'general_information-name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM
cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='1') AS 'profile_first_name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='2') AS 'profile_last_name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='3') AS 'profile_e-mail_address' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='4') AS 'profile_phone_-_office' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='6') AS 'profile_fax' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='7') AS 'profile_password' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values
proffv LEFT JOIN cf_profiles_fields
proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='9') AS 'profile_phone_-_cell' , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=9 AND cfv.memberid=core.id) AS bicycles_build_material , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=10 AND cfv.memberid=core.id) AS bicycles_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=7 AND cfv.memberid=core.id) AS bicycles_frame_size , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=8 AND cfv.memberid=core.id) AS bicycles_wheel_size , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=4 AND cfv.memberid=core.id) AS cars_exterior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=5 AND cfv.memberid=core.id) AS cars_interior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=18 AND cfv.memberid=core.id) AS cars_interior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=17 AND cfv.memberid=core.id) AS cars_license , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=1 AND cfv.memberid=core.id) AS cars_make , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=2 AND cfv.memberid=core.id) AS cars_model , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=14 AND cfv.memberid=core.id) AS cars_picture , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=6 AND cfv.memberid=core.id) AS cars_upholstery_material , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=15 AND cfv.memberid=core.id) AS cars_vehicle_history , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=16 AND cfv.memberid=core.id) AS cars_vin , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=3 AND cfv.memberid=core.id) AS cars_year , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=21 AND cfv.memberid=core.id) AS contact_info_email_address , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=20 AND cfv.memberid=core.id) AS contact_info_fax , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=19 AND cfv.memberid=core.id) AS contact_info_phone , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=22 AND cfv.memberid=core.id) AS contact_info_url , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=13 AND cfv.memberid=core.id) AS strollers_height , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=11 AND cfv.memberid=core.id) AS strollers_seats , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=12 AND cfv.memberid=core.id) AS strollers_wheels FROM cf_members core LEFT JOIN cf_members pregi ON pregi.id=core.id