4

交差点はmysqlでサポートされていないため、交差点を削除するために一日の大半を費やしてきました。誰かがいくつかの指針を提供できれば、それは本当に役に立ちます。

SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age 
FROM user U, user_utilisation UU 
WHERE U.id_user = UU.id_user AND cp >= 1 AND cp <= 3000 AND sexe = 'M' AND UU.id_mailing = 6 
GROUP BY U.id_user 
HAVING age >= 1 AND age <= 100 
ORDER BY nom, prenom

INTERSECT 

SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age 
FROM user U, user_utilisation UU 
WHERE U.id_user = UU.id_user AND cp >= 1 AND cp <= 3000 AND sexe = 'M' AND UU.id_mailing = 7 
GROUP BY U.id_user 
HAVING age >= 1 AND age <= 100 
ORDER BY nom, prenom

私は(s)で試しましJOINたが、今私が持っているものは次のとおりです:

SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(naissance, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(naissance, '00-%m-%d')) AS age 
FROM user U, user_utilisation UU 
WHERE U.id_user = UU.id_user AND cp >= 1 AND cp <= 3000 AND sexe = 'M' 
    AND UU.id_user IN (select id_user from user_utilisation where id_mailing = 6 OR id_mailing = 7) 
HAVING age >= 1 AND age <= 100 
ORDER BY nom, prenom

しかし、を削除するGROUP BYと、クエリが 2 つのレコードを選択したことがわかりますがid_mailing = 1GROUP BYは間違ったレコードを隠しています。これは問題を引き起こす可能性があると確信しています...

user_utilisationid_userには、 、id_mailing、および の3 つのフィールドしかありませんdate

4

3 に答える 3

2

あなたの質問を解釈すると、それは私には思えます:

  1. mailing_id 6および7に参加するすべてのユーザーを取得したい(そういうわけで、あなたはそうしていINTERSECTますか?)。
  2. これらのユーザーを基準で制限し、年齢の計算を実行する必要があります。

私のあなたの意図の解釈が正しければ(それが事実かどうかはまったくわかりません!)、まったく必要ありません。必要なINTERSECT基準で必要なユーザーを選択するだけで、両方への参加を制限できるはずです。経由で6と7を郵送JOIN

SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age 
FROM user U
INNER JOIN user_utilisation UU on U.id_user = UU.id_user and UU.mailing_id = 6
INNER JOIN user_utilisation UU2 on U.id_user = UU2.id_user and UU2.mailing_id = 7
WHERE cp >= 1 AND cp <= 3000 AND sexe = 'M' 
HAVING age >= 1 AND age <= 100 
ORDER BY nom, prenom
于 2013-01-21T17:04:42.357 に答える
1

次のようなことを試すことができます。

SELECT *
  FROM
      (SELECT *
            , DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age 
        FROM user U
             INNER JOIN user_utilisation UU 
                     ON U.id_user = UU.id_user
        WHERE cp >= 1 AND cp <= 3000 
              AND sexe = 'M'
              AND UU.id_mailing = 6 
        GROUP BY U.id_user 
        HAVING age >= 1 AND age <= 100) QUERY1
 WHERE EXISTS(SELECT *
            , DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age 
        FROM user U
             INNER JOIN user_utilisation UU 
                     ON U.id_user = UU.id_user
        WHERE cp >= 1 AND cp <= 3000 
              AND sexe = 'M'
              AND UU.id_mailing = 7
              AND U.id_user = QUERY1.id_user
        GROUP BY U.id_user 
        )
ORDER BY nom, prenom

上記のクエリのトリックは、WHERE EXISTS( ... ) 句が、以前に使用していた INTERSECT と同様のフィルターとして機能することです。アイデアは、id_user が QUERY1 クエリの id_user と同じであることを条件とする EXITS 句のクエリに少なくとも 1 つのレコードがあるという基準を満たすクエリ QUERY1 からのレコードのみを選択することです。 ..これが意味をなすことを願っています..

User テーブルの構造を提供していただければ、おそらく少し調整できます。ところで、これらのブランケット SELECT * ステートメントを使用することはお勧めできません..

于 2013-01-21T16:57:09.937 に答える
0

クエリを簡素化できると思います。それはいくつかの好奇心を持っています。まず、クエリで適切な結合構文が使用されていません。第 2 に、クエリはhavingからエイリアスをフィルタリングするためだけに句を使用していますselect。その場合はサブクエリをお勧めします。

2 つの非常によく似たクエリで定義されているように、両方の「グループ」に属するユーザーを取得しようとしているようです (where句のみが異なります)。以下はあなたが探しているものかもしれません:

select t.*
from (SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age,
             (case when cp >= 1 AND cp <= 3000 AND sexe = 'M' AND UU.id_mailing = 6 then 'FirstGroup'
                   when cp >= 1 AND cp <= 3000 AND sexe = 'M' AND UU.id_mailing = 7 then 'SecondGroup'
              end) as thegroup
      FROM user U join user_utilisation UU 
           on U.id_user = UU.id_user
     ) t
where thegroup is not null and age between 1 and 100
GROUP BY U.id_user
having max(thegroup) <> min(thegroup)
ORDER BY nom, prenom

このhaving句は、ユーザーが両方のグループに属していることを簡潔に表したものです。

于 2013-01-21T17:19:21.360 に答える