1

以下のような値のテーブルが2つあります。

tbl_users

user_ID      name     
1          somename1   
2          somename2   
3          somename3   

tbl_interviews

int_ID     user_ID      answer          date      
 1            1         sometextaba   2012-11-04 
 2            2         sometextxcec  2012-10-05
 3            1         sometextabs   2011-06-04
 4            3         sometextxcfc  2012-11-04
 5            3         sometextxcdn  2012-11-04

今年インタビューされたが、過去数年間に別のインタビューを受けた上記の表の唯一のユーザーをmysqlに教えてもらうにはどうすればよいですか?唯一のユーザーはid=1のユーザーです(今年はインタビュー(int_id 1)を行ったためですが、最初のインタビューは2011年(int-id 3)でした)。残念ながら、それらを選択することすらできません。 。

4

4 に答える 4

2

参加の一方の側には今年のインタビューのみが含まれ、もう一方の側には前年のみが含まれる、それ自体に対してテーブルに参加することにより、結果はINNER JOIN両方を持つユーザーになります。

集計やサブクエリに依存する必要がないため、この方法は非常に効率的です。特に、date列にインデックスがある場合。

SELECT
  DISTINCT
  thisyear.user_ID,
  name
FROM
  /* Left side of join retrieces only this year (year=2012) */
  tbl_interviews thisyear
  /* Right side retrieves year < 2012 */
  /* The combined result will elmininate any users who don't exist on both sides of the join */
  INNER JOIN tbl_interviews previous_years ON thisyear.user_ID = previous_years.user_ID
  /* and JOIN in the user table to get a name */
  INNER JOIN tbl_users ON tbl_users.user_ID = thisyear.user_ID
WHERE
  YEAR(thisyear.date) = 2012
  AND YEAR(previous_years.date) < 2012

これがSQLFiddleのデモンストレーションです

于 2012-11-10T14:40:17.617 に答える
1

JOIN単純なアプローチで、おそらくsよりも効率が悪い

SELECT DISTINCT user_ID
FROM   tbl_interviews
WHERE  user_ID IN (
                   SELECT   user_ID
                   FROM     tbl_interviews 
                   WHERE    date < 2012-01-01
                  ) 
   AND user_ID IN (
                   SELECT   user_ID
                   FROM     tbl_interviews 
                   WHERE    date > 2012-01-01
                  )          
于 2012-11-10T14:48:25.407 に答える
1

以下は、今年のインタビューを受けたユーザーを示しています。前の年にも出演したユーザーのみです。

SELECT Distinct tc.user_ID  FROM  tbl_interviews tc
INNER JOIN tbl_interviews tp ON tc.user_ID = tp.user_ID
WHERE YEAR(tc.date) = Year(curDate())  AND YEAR(tp.date) < Year(curDate());

SqlFiddleデモ

于 2012-11-10T17:03:09.687 に答える
0

これは、結合がなく、副選択が1つしかないバージョンです。

SELECT user_id
FROM (
    SELECT user_id,
           MAX(date) AS last_interview,
           COUNT(int_id) AS interviews
    FROM tbl_interviews
    GROUP BY user_id) AS t
WHERE YEAR(last_interview) = 2012 AND interviews > 1

グループtbl_interviews化しuser_idて、ユーザーごとのインタビューの数をカウントし、(今年のインタビューに加えて)複数のインタビューを行っているユーザーをフィルターに掛けることができます。このテーマには、特定のニーズに応じてさまざまなバリエーションがあります。微調整が必​​要な場合はお知らせください。

たとえば、これも機能するはずです。

SELECT user_id
FROM (
    SELECT user_id,
           BIT_OR(YEAR(date) = 2012) AS this_year,
           BIT_OR(YEAR(date) < 2012) AS other_year
    FROM tbl_interviews
    GROUP BY user_id) AS t
WHERE this_year AND other_year
于 2012-11-10T14:49:16.797 に答える