有没有更好的方法可以查询数据库以检查两者之间的表之一中数据库中是否存在某些数据?

时间:2019-06-27 13:36:00

标签: mysql sql

我想知道是否有更好的查询数据库的方法来检查两个表之一中某个列中是否存在某些数据。我现在使用两个查询来检查数据是否存在,但我坚信有某种方法。 示例:我在MySQL中有两个表-供应商和用户。我需要检查用户名是否存在于供应商表或用户表中,如果不存在,请允许客户端(不要感到困惑,客户端是指客户端在浏览器中执行操作)使用用户名。假设我在两个表中都有两列:

供应商表:supplier_id, supplier_username

用户表:user_id, user_username

我目前正在向数据库查询两次,以检查用户名是否可用。

SELECT supplier_id FROM suppliers WHERE supplier_username = ?

一旦获得数据,如果有0行,则对users表执行相同的操作;如果获得0行,则再次提供用户名。

用户名必须唯一。

我需要是否有更好的方法(也许是一个查询)来获取用户名是否可用。

谢谢!

3 个答案:

答案 0 :(得分:0)

进行内部联接。如果返回0,它将告诉您两个表中都不存在该记录:

SELECT COUNT(*)
FROM suppliers s
INNER JOIN users u
ON s.supplier_username = u.user_username
WHERE u.user_username = @username

答案 1 :(得分:0)

表联接的局限性在于,一个表中的数据始终以另一表中的数据为条件。为了引用每个表作为自己的数据集,可以使用UNION合并列表。

SELECT supplier_id as id, supplier_username as name FROM suppliers WHERE supplier_username = '?'
UNION 
SELECT user_id, user_username FROM users WHERE user_username = '?'

或者,您可以通过将Select union语句用作From子句,允许排序顺序,部分搜索条件等,将其更进一步。

SELECT c.id, c.name 
from (SELECT s.supplier_id as id, s.supplier_username as name FROM suppliers as s
UNION 
SELECT u.user_id as id, u.user_username as name FROM users as u) as c
WHERE c.name like '%?%'
Order by c.name 

答案 2 :(得分:0)

有几种可能的查询模式。

UNION ALL集运算符可以合并两个SELECT的结果,每个SELECT必须返回相同数量的列和相同数据类型的列。我们通常会另外添加一个鉴别符列,告诉我们哪个SELECT返回了哪一行。

例如:

( SELECT 's' AS src
       , s.supplier_id  AS id
    FROM suppliers s
   WHERE s.supplier_username = ?
)
UNION ALL 
( SELECT 'u' AS src
       , u.user_id
    FROM users u
   WHERE u.user_username = ?
)

另一种替代方法是,如果我们不需要检索id值,而只想获取匹配supplier_username / user_username的行数,则n我们可以做这样的事情:

SELECT COUNT(DISTINCT s.supplier_id) + COUNT(DISTINCT u.user_id) AS cnt
  FROM ( SELECT 1 AS n ) i
  LEFT
  JOIN suppliers s
    ON s.supplier_username = ?
  LEFT
  JOIN users u
    ON u.user_username = ?