2017-07-13 16 views
0

ローカルのWordPress(bbPress)からいくつかのデータをエクスポートしようとしていますが、データベースに存在しないGROUP_CONCAT列にデータが重複しています。私はポスト、そのメタ情報、および各行のその著者の情報を持っている一つの大きなビューを取得しようとしているMySQL GROUP_CONCATは不要な重複を防止します

SELECT 
    a.`ID`, a.`post_date`, a.`post_content`, a.`post_title`, 
    a.`post_status`, a.`post_name`, a.`post_type`, a.`post_parent`, 
    GROUP_CONCAT(d.`meta_key` SEPARATOR '{|}') AS `post_meta_keys`, 
    GROUP_CONCAT(d.`meta_value` SEPARATOR '{|}') AS `post_meta_values`, 
    b.`user_login`, b.`user_pass`, b.`user_nicename`, b.`user_email`, 
    b.`user_registered`, b.`display_name`, 
    GROUP_CONCAT(c.`meta_key` SEPARATOR '{|}') AS `user_meta_keys`, 
    GROUP_CONCAT(c.`meta_value` SEPARATOR '{|}') AS `user_meta_values` 
FROM 
    `wp_posts` a 
INNER JOIN 
    `wp_users` b ON a.`post_author` = b.`ID` 
INNER JOIN 
    `wp_usermeta` c ON a.`post_author` = c.`user_id` 
INNER JOIN 
    `wp_postmeta` d ON a.`ID` = d.`post_id` 
WHERE 
    `post_type` = 'forum' OR 
    `post_type` = 'topic' OR 
    `post_type` = 'reply' 
GROUP BY 
    a.`ID` 

は、ここでのクエリです。 GROUP_CONCAT列に複数の重複がある以外は、すべてが良好です。たとえば、次の結果セットの最初の行から - カラムuser_meta_keys値を有する:

[0] => nickname 
[1] => first_name 
[2] => last_name 
[3] => description 
[4] => rich_editing 
[5] => comment_shortcuts 
[6] => admin_color 
[7] => use_ssl 
[8] => show_admin_bar_front 
[9] => locale 
[10] => wp_capabilities 
[11] => wp_user_level 
[12] => dismissed_wp_pointers 
[13] => show_welcome_panel 
[14] => session_tokens 
[15] => wp_dashboard_quick_press_last_post_id 
[16] => community-events-location 
[17] => managenav-menuscolumnshidden 
[18] => metaboxhidden_nav-menus 
[19] => nav_menu_recently_edited 
[20] => users_per_page 
[21] => wp__bbp_topic_count 
[22] => wp__bbp_reply_count 
[23] => nickname 
[24] => first_name 
[25] => last_name 
[26] => description 
[27] => rich_editing 
[28] => comment_shortcuts 
[29] => admin_color 
[30] => use_ssl 
[31] => show_admin_bar_front 
[32] => locale 
[33] => wp_capabilities 
[34] => wp_user_level 
[35] => dismissed_wp_pointers 
[36] => show_welcome_panel 
[37] => session_tokens 
[38] => wp_dashboard_quick_press_last_post_id 
[39] => community-events-location 
[40] => managenav-menuscolumnshidden 
[41] => metaboxhidden_nav-menus 
[42] => nav_menu_recently_edited 
[43] => users_per_page 
[44] => wp__bbp_topic_count 
[45] => wp__bbp_reply_count 
[46] => nickname 
[47] => first_name 
[48] => last_name 
[49] => description 
[50] => rich_editing 
[51] => comment_shortcuts 
[52] => admin_color 
[53] => use_ssl 
[54] => show_admin_bar_ 

ニックネームを3回複製され、他のフィールドの多くは、あまりにもあります。私はいくつかの検索をしたし、他の人もこれを経験したように見える。グループ化された列で "DISTINCT"を使用して解決する人もいますが、値の一部が実際に複製されているため、それは機能しません。

だから私の質問は以下のとおりです。

1)GROUP_CONCAT列は非常に多くの重複があり、クエリが間違って書かれている場合、なぜ誰かが私に説明することができます - 私は、少なくとも数は「キーの間で一致して理解う列と '値'列 - しかしそれらもどちらもしません。

2)私が探しているものを達成するためにクエリを調整できますか?

ありがとうございました!

- EDIT#1 - よく間違っているのは、MySQLでGROUP_CONCATの上限を設定するのを忘れていたからです。

- EDIT#2 - GROUPSは各代替テーブルにある行数だけ複製されているようですね。つまり、ポストIDに一致する8行がポストIDと一致するので、usermetaの結果に8つの重複グループがあります...あるいは、ユーザーIDと一致する23の行がusermetaテーブルにあります。したがって、23の重複グループがありますpostmetaの結果では...私はまだ現在これを修正する方法を探しています。

- EDIT#3 - ここで

が追加MCVEです:

- 元のクエリ:http://sqlfiddle.com/#!9/386b98/2

- 更新クエリ:http://sqlfiddle.com/#!9/386b98/3

+0

を参照してください:[?なぜ私は非常に単純なSQLクエリであることを私には思える何のためMCVEを提供する必要があります](https://meta.stackoverflow.com/questions/333952 /私が提供しようとしている、なぜ私が提供するものなのでしょうか? – Strawberry

+0

@Strawberry - そうです - 私は見ていきます将来のすべてのSQL質問にMCVEを追加してください。できるだけ早く訪問者が2つのクエリの違いを見ることができるように、ここに追加します –

答えて

0

重複問題が発生したため、私はJOINSがSQLで処理される方法を知らなかった - (私はまだ学んでいる) - このスタックオーバーフローの答えは本当に私を助けた(マーティンスミス)sql joins as venn diagram

user_metaテーブルの複数の行にまたがってデータを結合すると、テーブルの各行が何度も連結されているように見えます。逆もまた同様です。

SELECT 
    a.`ID`, a.`post_date`, a.`post_content`, a.`post_title`, 
    a.`post_status`, a.`post_name`, a.`post_type`, a.`post_parent`, 
    (SELECT GROUP_CONCAT(d.`meta_key` SEPARATOR '{|}') FROM `wp_postmeta` d 
     WHERE d.`post_id` = a.`ID`) AS `post_meta_keys`, 
    (SELECT GROUP_CONCAT(d.`meta_value` SEPARATOR '{|}') FROM `wp_postmeta` d 
     WHERE d.`post_id` = a.`ID`) AS `post_meta_values`, 
    b.`user_login`, b.`user_pass`, b.`user_nicename`, b.`user_email`, 
    b.`user_registered`, b.`display_name`, 
    (SELECT GROUP_CONCAT(c.`meta_key` SEPARATOR '{|}') FROM `wp_usermeta` c 
     WHERE c.`user_id` = a.`post_author`) AS `user_meta_keys`, 
    (SELECT GROUP_CONCAT(c.`meta_value` SEPARATOR '{|}') FROM `wp_usermeta` c 
     WHERE c.`user_id` = a.`post_author`) AS `user_meta_values` 
FROM 
    `wp_posts` a 
INNER JOIN 
    `wp_users` b ON a.`post_author` = b.`ID` 
WHERE 
    `post_type` = 'forum' OR 
    `post_type` = 'topic' OR 
    `post_type` = 'reply' 
GROUP BY a.`ID` 

私はあなたがそれを行うことができます知らなかった - これは多くを生成します。このように - だから私の現在のソリューションは、これらの2つのテーブルのJOINと単純に文のSELECT部分​​にそれらを追加INNERを削除することですより早く/よりクリーンな結果。

- 実施例:http://sqlfiddle.com/#!9/386b98/3

関連する問題