0

この問題の最初の部分は、昨日ここでいくつかの良い助けによって解決されましたが、今日は必要なクエリを完了するのに苦労しています。いくつかの条件に基づいて 5 つの結合されたテーブルから複数の列を取得しようとしていますが、結果セットには p.id (データ エントリ テーブルの外部キーであるペット ID) ごとに 1 つの異なる「データ エントリ」のみが含まれるようにします。 - この data_entry は、その p.id を持つすべての data_entries の中で最大数を持つ必要があります (つまり、特定のペットは 1、2、および 3 の番号が付けられた data_entries を持つことができます - 私は 3 番だけが必要です)。以下のコードは最初のクエリで正しく機能していますが、返された最大レコードの「更新された」日付をチェックする句を追加したいのですが、この句を正しく統合する方法がわかりません。

どんな助けでも大歓迎です:

この単純化されたクエリは、3 つの結合されたテーブル間で正しく機能します (日付比較句なし)。

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY `d`.`number` DESC 

ただし、以下の日付比較句と余分なテーブル間の結合を追加しようとすると、クエリは data_entry の「更新された」列に対して MAX 番号で日付比較を実行せず、代わりに最も低いものに対してチェックします番号。

SELECT `p`.`id` AS `pet_id`, `o`.`id` AS `owner_id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`, `k_records_owners` AS `kcro`, `k_records` AS `kcr`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
AND `p`.`kc_number` = `kcr`.`do_dg_dog_no` 
AND `kcr`.`pa_breeder_no` = `kcro`.`contact_no` 
AND FROM_UNIXTIME(`d`.`updated`, "%Y-%m-%d") <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), "%Y-%m-%d") 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY MAX(d.number) DESC

編集: 最新の試行 - 「句を持っている」で不明な列「d2.updated」が発生します

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr)
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d.number = d2.number
GROUP BY p.id, o.id, o.email 
having FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
ORDER BY max_d DESC
4

1 に答える 1

0

これを試して:

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr)
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d2.number = max_d
AND FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
GROUP BY p.id, o.id, o.email 
ORDER BY max_d DESC
于 2010-08-13T19:43:44.043 に答える