MYSQL选择使用concat与不在陈述

时间:2018-10-18 22:28:42

标签: mysql

有人可以纠正我的语法错误吗?正在尝试通过名字,姓氏和他们的电子邮件搜索用户

SELECT
  USERID,
  FNAME,
  LNAME
FROM
  USERS
WHERE
  CONCAT(FNAME, ', ', LNAME, ', ', EMAIL) LIKE CONCAT('%', REPLACE('keyword ', ' ', '%'), '%', '%') NOT IN (
    SELECT
      PRODUCT_ID
    FROM
      ITEMS
    WHERE
      USER = 'JANE'
      AND PRICE = '400'
      AND ORDER = 'PAID'
  )

我想搜索并获取用户ID,名字和姓氏。但我不想得到简,价格= 400,订单=已付款

TABLE USER

USERID        FNAME     LNAME          EMAIL 
1             JANE      DEO          TES@TED.COM
2              KEL      DEO          TES@TED.COM
3              MK       DEO          TES@TED.COM


TABLE ITEMS 

PRODUCT_ID  PRICE    ITEM_NUM  USER    USERID
1           400        40      JANE       1
2           200        20      KEL        2
3           100        10      MK         3

所以我想让其他人与简·罗(JANE ROW)分开

我的尝试是

SELECT SND.USERID, SND.FNAME, SND.LNAME WHERE CONCAT(FNAME, ', ', LNAME, ', ', EMAIL) LIKE CONCAT('%', REPLACE('keyword', ' ', '%'), '%', '%') FROM items as M JOIN users as SND ON SND.USERID WHERE NOT EXISTS(SELECT * FROM ITEMS WHERE M.USER = 'JANE' AND M.PRICE ='400' AND M.ITEM_NUM ='40')

1 个答案:

答案 0 :(得分:0)

您不能在select和from子句之间包含where子句

SELECT
   SND.USERID
 , SND.FNAME
 , SND.LNAME

>> no where clause here

FROM items AS M
INNER JOIN users AS SND ON SND.USERID
WHERE NOT EXISTS (
  SELECT *
  FROM ITEMS
  WHERE M.USER = 'JANE'
   AND M.PRICE = '400'
   AND M.ITEM_NUM = '40'
  )

只需将所有需要的条件包括在一个(唯一的)where子句中,并根据需要使用AND或OR合并那些条件。我已经更改了连接条件,并且还更改了所使用的NOT语法。

SELECT
   SND.USERID
 , SND.FNAME
 , SND.LNAME
FROM items AS M
INNER JOIN users AS SND ON M.userid = SND.userid
WHERE CONCAT(FNAME, ', ', LNAME, ', ', EMAIL) LIKE CONCAT('%', REPLACE('keyword', ' ', '%'), '%', '%') 
AND NOT (
       M.USER = 'JANE'
   AND M.PRICE = '400'
   AND M.ITEM_NUM = '40'
  )

我对您在上面使用concat()感到不满意,但是它看起来效率很低,相反,为什么不对每列重复LIKE测试。 (是的,这可能会使SQL代码更长,但这并不表示查询的执行时间。)

SELECT
   SND.USERID
 , SND.FNAME
 , SND.LNAME
FROM items AS M
INNER JOIN users AS SND ON M.userid = SND.userid
WHERE (
   SND.FNAME LIKE CONCAT('%', REPLACE('keyword', ' ', '%'))
or SND.LNAME LIKE CONCAT('%', REPLACE('keyword', ' ', '%'))
or SND.EMAIL LIKE CONCAT('%', REPLACE('keyword', ' ', '%'))
)
AND NOT (
       M.USER = 'JANE'
   AND M.PRICE = '400'
   AND M.ITEM_NUM = '40'
  )

请注意在或在where子句中使用缩进和括号。 (您不必将SQL放在一行中,不必确定为什么要在问题中这样做。)