2

検索結果を取得するためのクエリがありますが、これは正常に機能します。

成功したクエリの例:

 SELECT
    individuals.individual_id,
    individuals.unique_id,
    TIMESTAMPDIFF(YEAR,individuals.day_of_birth,CURDATE()) AS age,
    individuals_dynamics.id,
    individuals_achievements.degree
  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  LEFT JOIN
    individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id
  WHERE
    $uuid_access_status $display_type $detailed_search_query
  ORDER BY 
    $search_sort $search_order

これからは、individuals_achievements個人ごとに複数のレコードがあり、ここで MAX 値 (最新の ID) を取得したいと考えています。

さまざまなクエリを試しましたが、常にエラーCall to a member function rowCount() on a non-object が発生していました。

そのエラーの意味は理解できますが、どこでその間違いを犯しているのか、何が一般的に間違っているのかわかりません。

私の失敗した試みの例:

  SELECT
    individuals.individual_id,
    individuals.unique_id,
    TIMESTAMPDIFF(YEAR,individuals.day_of_birth,CURDATE()) AS age,
    individuals_dynamics.id,
    individuals_achievements.degree
  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  INNER JOIN
  (
       SELECT
            degree, MAX(id) AS latest_record
       FROM
            individuals_achievements
       GROUP BY
            latest_record
  ) individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id
  WHERE
    $uuid_access_status $display_type $detailed_search_query
  ORDER BY 
    $search_sort $search_order

ここで何が欠けていますか?何か助けてください。

4

5 に答える 5

2

これはあなたのfrom条項です:

  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  INNER JOIN
  (
       SELECT
            degree, MAX(id) AS latest_record
       FROM
            individuals_achievements
       GROUP BY
            latest_record
  ) individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id;

少なくとも 3 つの問題を見つけることができます。一つ目はindividuals_achievements AS individuals_achievements; individuals_achievements.individual_id2 番目は、サブクエリにない参照です。3 つ目はgroup by latest_record.

  FROM individuals LEFT JOIN
       individuals_dynamics
       ON individuals.unique_id = individuals_dynamics.individual_id LEFT JOIN
       individuals_achievements
       ON individuals.unique_id = individuals_achievements.individual_id JOIN
       (SELECT ia.individual_id, MAX(ia.id) AS latest_record
        FROM individuals_achievements ia
        GROUP BY ia.individual_id
       ) iamax
       ON individuals.unique_id = iamax.individual_id and
          individuals_achievements.id = iamax.latest_record

これにより、最新のレコードの ID を持つ追加のサブクエリが追加されます。

ところで、テーブル エイリアスをテーブル名と同じ名前にするのは冗長です。それはクエリを混乱させるだけです。iaまた、 forのように、テーブルの省略形をエイリアスに使用することをお勧めしますindividuals_achievementsfromこの回答は節のみに焦点を当てているため、その変更は行っていません。

于 2013-09-19T19:16:26.587 に答える
0

まずAS、クエリを読みやすくするために SQL でキーワードを実際に使用していないため、これが役立ちます。WHEREそして、節の (php?) 変数には何が入っているのだろうと思っています。

また、サブクエリはフィールドを返してindividual_idいませんが、結合しようとしています。私はあなたがこれを望むかもしれないと思う:

SELECT
  ind.individual_id,
  ind.unique_id,
  TIMESTAMPDIFF(YEAR,ind.day_of_birth,CURDATE()) AS age,
  ind_dyn.id,
  ind_ach.degree
FROM
  individuals as ind
LEFT JOIN
  individuals_dynamics AS ind_dyn ON ind.unique_id = ind_dyn.individual_id
INNER JOIN
  individuals_achievements AS ind_ach 
     ON ind_ach.individual_id = ind.unique_id
    AND ind_ach.id =
    (
      SELECT MAX(id) FROM individuals_achievements
      WHERE individuals_achievements.individual_id = ind.unique_id
    )
WHERE
  $uuid_access_status $display_type $detailed_search_query
ORDER BY 
  $search_sort $search_order
于 2013-09-19T19:20:29.313 に答える
0

PDO::queryFALSEクエリの処理中にエラーが発生した場合は を返します。メンバー関数として適用rowCountするFALSEと、表示されているエラーが発生します。

構文エラーがないかクエリをチェックし、PDO返されるエラー メッセージを解析します。

于 2013-09-19T19:08:42.667 に答える