简体   繁体   中英

mysql trying a select with multiple conditions

I have 2 tables with values like below:

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

how can i ask mysql tell me who is the only user in the table above that was interviewed this year but had also another interview in the previous years? the only one is the user with id = 1 (since he had an interview (the int_id 1) this year, but the first interview was in 2011 (int-id 3). ) unfortunately I'm not able even to select them..

By joining the table against itself, where one side of the join only includes interviews from this year and the other side only includes previous years, the result of the INNER JOIN will be users having both.

Because it doesn't need to rely on any aggregates or subqueries, this method should be extremely efficient. Especially so, if the date column has an index.

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

Here is a demonstration on SQLFiddle

A simple approach, perhaps less efficient than 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
                  )          

Following gives you the users taking interviews in Current year, only those who also had appeared in some Previous year/s

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 Demo

Here is a version with no joins, and only one subselect.

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

You can group tbl_interviews by user_id to count the number of interviews per user, and then filter for users who have more than one interview (in addition to having an interview this year). There a number of variations on this theme, according to your specific needs, so let me know if needs a tweak.

For example, this should work as well.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM