遭遇例4

MySQL用語集

カテゴリー: エラー  閲覧数:204 配信日:2020-03-15 09:44


修正前


         public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
   {
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
     
     
     
       $sql = "
       


       
SELECT
a.id AS id,
a.category_id AS category_id,
 a.project_id AS project_id,
 a.domain_id AS domain_id,
a.state_id AS state_id,
 a.official_url AS official_url,
 a.body AS body,
 a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
 z.*,
 s.situation,
 s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
 c.color AS category_color,
 p.color AS project_color,
 d.color AS domain_color
FROM
status AS a

LEFT JOIN user u ON a.user_id = u.id
 LEFT JOIN category c ON a.category_id = c.category_id
 LEFT JOIN project p ON a.project_id = p.project_id
 LEFT JOIN domain d ON a.domain_id = d.domain_id
 LEFT JOIN status_tag st ON (a.id = st.status_id)
 LEFT JOIN state s ON a.state_id = s.state_id
 RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id

 LEFT JOIN(
   SELECT
     a.category_id, a.category, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.category
       else b.category
       end AS parent_category,
       CASE WHEN a.parent_id = 0
       then a.category_id
       else a.parent_id
       end AS parent_id2      
   FROM
     category a
   LEFT JOIN
     category b on a.parent_id = b.category_id        
 ) AS z ON a.category_id = z.category_id

 LEFT JOIN(
   SELECT
     a.project_id, a.project, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.project
       else b.project
       end AS parent_project,
       CASE WHEN a.parent_id = 0
       then a.project_id
       else a.parent_id
       end AS parent_id2      
   FROM
     project a
   LEFT JOIN
     project b on a.parent_id = b.project_id        
 ) AS x ON a.project_id = x.project_id

 LEFT JOIN(
   SELECT
     a.domain_id, a.domain, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.domain
       else b.domain
       end AS parent_domain,
       CASE WHEN a.parent_id = 0
       then a.domain_id
       else a.parent_id
       end AS parent_id2      
   FROM
     domain a
   LEFT JOIN
     domain b on a.parent_id = b.domain_id        
 ) AS y ON a.domain_id = y.domain_id

WHERE a.public = 1
GROUP BY a.id
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC,  a.`created_at` DESC

";
       return $this->fetchAll($sql);
   }


JOIN追加したらエラー発生


LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
`chr`.`modified` AS chrmodified,
         public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
   {
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
     
     
     
       $sql = "
       


       
SELECT
a.id AS id,
a.category_id AS category_id,
 a.project_id AS project_id,
 a.domain_id AS domain_id,
a.state_id AS state_id,
 a.official_url AS official_url,
 a.body AS body,
 a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
 z.*,
 s.situation,
 s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
`chr`.`modified` AS chrmodified,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
 c.color AS category_color,
 p.color AS project_color,
 d.color AS domain_color
FROM
status AS a

LEFT JOIN user u ON a.user_id = u.id
 LEFT JOIN category c ON a.category_id = c.category_id
 LEFT JOIN project p ON a.project_id = p.project_id
 LEFT JOIN domain d ON a.domain_id = d.domain_id
 LEFT JOIN status_tag st ON (a.id = st.status_id)
 LEFT JOIN state s ON a.state_id = s.state_id
 LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
 RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id

 LEFT JOIN(
   SELECT
     a.category_id, a.category, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.category
       else b.category
       end AS parent_category,
       CASE WHEN a.parent_id = 0
       then a.category_id
       else a.parent_id
       end AS parent_id2      
   FROM
     category a
   LEFT JOIN
     category b on a.parent_id = b.category_id        
 ) AS z ON a.category_id = z.category_id

 LEFT JOIN(
   SELECT
     a.project_id, a.project, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.project
       else b.project
       end AS parent_project,
       CASE WHEN a.parent_id = 0
       then a.project_id
       else a.parent_id
       end AS parent_id2      
   FROM
     project a
   LEFT JOIN
     project b on a.parent_id = b.project_id        
 ) AS x ON a.project_id = x.project_id

 LEFT JOIN(
   SELECT
     a.domain_id, a.domain, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.domain
       else b.domain
       end AS parent_domain,
       CASE WHEN a.parent_id = 0
       then a.domain_id
       else a.parent_id
       end AS parent_id2      
   FROM
     domain a
   LEFT JOIN
     domain b on a.parent_id = b.domain_id        
 ) AS y ON a.domain_id = y.domain_id

WHERE a.public = 1
GROUP BY a.id
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC,  a.`created_at` DESC

";
       return $this->fetchAll($sql);
   }


修正対応


SQLを一意に特定できるよう、GroupBy句に取得するカラムを指定
GROUP BY に chr.modified を追加
GROUP BY a.id,chr.modified
         public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
   {
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
     
     
     
       $sql = "
       


       
SELECT
a.id AS id,
a.category_id AS category_id,
 a.project_id AS project_id,
 a.domain_id AS domain_id,
a.state_id AS state_id,
 a.official_url AS official_url,
 a.body AS body,
 a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
 z.*,
 s.situation,
 s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
`chr`.`modified` AS chrmodified,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
 c.color AS category_color,
 p.color AS project_color,
 d.color AS domain_color
FROM
status AS a

LEFT JOIN user u ON a.user_id = u.id
 LEFT JOIN category c ON a.category_id = c.category_id
 LEFT JOIN project p ON a.project_id = p.project_id
 LEFT JOIN domain d ON a.domain_id = d.domain_id
 LEFT JOIN status_tag st ON (a.id = st.status_id)
 LEFT JOIN state s ON a.state_id = s.state_id
 LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
 RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id

 LEFT JOIN(
   SELECT
     a.category_id, a.category, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.category
       else b.category
       end AS parent_category,
       CASE WHEN a.parent_id = 0
       then a.category_id
       else a.parent_id
       end AS parent_id2      
   FROM
     category a
   LEFT JOIN
     category b on a.parent_id = b.category_id        
 ) AS z ON a.category_id = z.category_id

 LEFT JOIN(
   SELECT
     a.project_id, a.project, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.project
       else b.project
       end AS parent_project,
       CASE WHEN a.parent_id = 0
       then a.project_id
       else a.parent_id
       end AS parent_id2      
   FROM
     project a
   LEFT JOIN
     project b on a.parent_id = b.project_id        
 ) AS x ON a.project_id = x.project_id

 LEFT JOIN(
   SELECT
     a.domain_id, a.domain, a.parent_id,
       CASE WHEN a.parent_id = 0
       then a.fonticon
       else b.fonticon
       end AS fonticon,
       CASE WHEN a.parent_id = 0
       then a.color
       else b.color
       end  AS color,
       CASE WHEN a.parent_id = 0
       then a.domain
       else b.domain
       end AS parent_domain,
       CASE WHEN a.parent_id = 0
       then a.domain_id
       else a.parent_id
       end AS parent_id2      
   FROM
     domain a
   LEFT JOIN
     domain b on a.parent_id = b.domain_id        
 ) AS y ON a.domain_id = y.domain_id

WHERE a.public = 1
GROUP BY a.id,chr.modified
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC,  a.`created_at` DESC

";
       return $this->fetchAll($sql);
   }



MySQLでSELECT文を作成するための基本的な考え方。どの構文を採用するか、までの思考履歴

指定期間人気ページランキング / 2020-5-28 → 2025-4-24
順位 ページタイトル抜粋 アクセス数
1 #1241 - オペランドに 1 個の列が必要です。 | エラー 3601
2 MySQL用語 1560
3 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry | エラー 1356
4 クエリエラー: #1265 - 列 'カラム名' の 行 ★ でデータが切り捨てられました。 | エラー 1335
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value | エラー 927
6 Data truncated for column | エラー 608
7 where clause is ambiguous | エラー 600
8 Incorrect integer value | エラー 582
9 クエリエラー: #1294 - 列 'カラム名' に ON UPDATE旬は無効です。 | エラー 567
10 <> | 演算子 477
11 スキーマ | データベースの構造 451
12 インデックス | 最適化 407
13 #1067 - Invalid default value for 'id' | エラー 389
14 SELECT list is not in GROUP BY clause and contains nonaggregated column | エラー 265
15 #3106 - 'Fulltext index on virtual generated column' is not supported for generated columns. | エラー 245
16 問題発生 / ハマった点 / indexを確認 243
17 エラーメッセージ / エラー原因 / エラー対応 239
18 遭遇例1.INT型カラムに空文字INSERT 238
19 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ★★ at line △△ | エラー 233
20 phpMyAdmin上で、VARCHARデータ型カラム を FLOATデータ型カラム へ変更しようとしたら、エラー発生 228
2025/4/25 1:01 更新