Search code examples
sqlmysql

Problems selecting multiple column


I have the following SQL query, which works for me on selecting all alerts which belongs to me or which I need to see from people am connected to in FRIENDS TABLE

----TABLE USERS-----
ID  ACCOUNT
1   80001
2   90001
3   70001

----TABLE FRIENDS-------
ID ACCOUNT  TO_ACCOUNT
1    80001    70001

----TABLE ALERTS-------
ID  ACCOUNT  ALERT  ALERTID
1   80001            Hi     XD3000
SELECT snd.ACCOUNT
FROM ALERTS AS m
JOIN USERS AS snd ON snd.ACCOUNT = m.ACCOUNT
WHERE snd.ACCOUNT IN (
  SELECT ACCOUNT
  FROM FRIENDS
  WHERE ACCOUNT = '80001' OR TO_ACCOUNT = '70001'
)
UNION
SELECT snd.ACCOUNT
FROM ALERTS AS m
JOIN USERS AS snd ON snd.ACCOUNT = m.ACCOUNT
WHERE snd.ACCOUNT IN (
  SELECT TO_ACCOUNT
  FROM FRIENDS
  WHERE TO_ACCOUNT = '70001' OR ACCOUNT = '80001'
)");

Now the problem is when I try to add this so that I can stop seeing all alerts which blocked by me, its not working

----TABLE ALERTS_BLOCKED-------
ID  ACCOUNT    ALERTID
1     80001         XD3000
SELECT snd.ACCOUNT
FROM ALERTS AS m
JOIN USERS AS snd ON snd.ACCOUNT = m.ACCOUNT
WHERE snd.ACCOUNT IN (
  SELECT ACCOUNT
  FROM FRIENDS
  WHERE ACCOUNT = '80001' OR TO_ACCOUNT = '70001'
)
AND WHERE m.ALERTID NOT IN (
  SELECT ALERTID
  FROM ALERTS_BLOCKED
  WHERE ACCOUNT = '80001'
)
UNION
SELECT snd.ACCOUNT
FROM ALERTS AS m
JOIN USERS AS snd ON snd.ACCOUNT = m.ACCOUNT
WHERE snd.ACCOUNT IN (
  SELECT TO_ACCOUNT
  FROM FRIENDS
  WHERE TO_ACCOUNT = '70001' OR ACCOUNT = '80001'
)
AND WHERE m.ALERTID NOT IN (
  SELECT ALERTID
  FROM ALERTS_BLOCKED
  WHERE ACCOUNT = '70001'
)");
`

Solution

  • Both queries are syntactically incorrect because of the trailing ") and the AND WHERE clause , the correct syntax for multiple parts to a where clause ( IN THIS CASE ) is simply AND .please review the manual https://dev.mysql.com/doc/refman/8.4/en/expressions.html

    SELECT snd.ACCOUNT
    FROM ALERTS AS m
    JOIN USRS AS snd ON snd.ACCOUNT = m.ACCOUNT
    WHERE snd.ACCOUNT IN (
      SELECT ACCOUNT
      FROM FRIENDS
      WHERE ACCOUNT = '80001' OR TO_ACCOUNT = '70001'
    )
    AND  m.ALERTID NOT IN (
      SELECT ALERTID
      FROM ALERTS_BLOCKED
      WHERE ACCOUNT = '80001'
    )
    UNION
    SELECT snd.ACCOUNT
    FROM ALERTS AS m
    JOIN USRS AS snd ON snd.ACCOUNT = m.ACCOUNT
    WHERE snd.ACCOUNT IN (
      SELECT TO_ACCOUNT
      FROM FRIENDS
      WHERE TO_ACCOUNT = '70001' OR ACCOUNT = '80001'
    )
    AND  m.ALERTID NOT IN (
      SELECT ALERTID
      FROM ALERTS_BLOCKED
      WHERE ACCOUNT = '70001'
    );
    

    https://dbfiddle.uk/gxwR6S2b