0

私の質問:

SELECT CONCAT(f.name, ' ', f.parent_names) AS FullName,
       stts.name AS 'Status',
       u.name AS Unit,
       city.name AS City,
       hus.mobile1 AS HusbandPhone,
       wife.mobile1 AS WifePhone,
       f.phone AS HomePhone,
       f.contact_initiation_date AS InitDate,
       fh.created_at AS StatusChangeDate,
       cmt.created_at AS CommentDate,
       cmt.comment AS LastComment
FROM families f
JOIN categories stts ON f.family_status_cat_id = stts.id
JOIN units u ON f.unit_id = u.id
JOIN categories city ON f.main_city_cat_id = city.id
JOIN contacts hus ON f.husband_id = hus.id
JOIN contacts wife ON f.wife_id = wife.id
JOIN comments cmt ON f.id = cmt.commentable_id
AND cmt.created_at =
    (SELECT MAX(created_at)
     FROM comments
     WHERE commentable_id = f.id)
JOIN family_histories fh ON f.id = fh.family_id
AND fh.created_at =
    (SELECT MAX(created_at)
     FROM family_histories
     WHERE family_id = f.id
         AND family_history_cat_id = 1422)
WHERE f.id = 17883

質問:結果は2行ですが、同じです。1つだけではなく2つの結果が得られるのはなぜですか?

4

2 に答える 2

1

1対多の関係があるテーブルを結合すると、複数の行が返されるように見えます。実際には、その行はマスターテーブルに1回しか存在しませんが、子テーブルの1つに関連データの複数の行があります。 。

また、子テーブルに一致するレコードがないため、予想されるデータが欠落している可能性があることに注意してください。その場合は、LEFTJOINを使用してください。

于 2013-03-04T20:50:34.777 に答える
1

おそらくコメントやfamily_historiesには二重の関係があるので、*結果として返すことで確認できます。どこかに違いがあるはずです。

問題を見つけるために完全な結果を提供します。

を設定することで解決できます(ただし、お勧めしません)DISTINCT

SELECT DISTINCT CONCAT(f.name, ' ', f.parent_names) AS FullName, stts.name AS 'Status', u.name AS Unit, city.name AS City, hus.mobile1 AS HusbandPhone, wife.mobile1 AS WifePhone, f.phone AS HomePhone, f.contact_initiation_date AS InitDate, fh.created_at AS StatusChangeDate, cmt.created_at AS CommentDate, cmt.comment AS LastComment
FROM families f JOIN categories stts ON f.family_status_cat_id = stts.id
JOIN units u ON f.unit_id = u.id
JOIN categories city ON f.main_city_cat_id = city.id
JOIN contacts hus ON f.husband_id = hus.id
JOIN contacts wife ON f.wife_id = wife.id
JOIN comments cmt ON f.id = cmt.commentable_id AND cmt.created_at = (SELECT MAX(created_at) FROM comments WHERE commentable_id = f.id)
JOIN family_histories fh ON f.id = fh.family_id AND fh.created_at = (SELECT MAX(created_at) FROM family_histories WHERE family_id = f.id AND family_history_cat_id = 1422)
WHERE f.id = 17883
于 2013-03-04T20:47:02.933 に答える