我想知道是否有一些更好的方法来查询数据库,以检查两个表中的一列中是否存在一些数据。现在,我正在使用两个查询来检查数据是否存在,但我坚信有某种方法。示例:我在MySQL中有两个表格 - 供应商和用户。我需要检查供应商表中的用户名是否存在于供应商表中还是在用户表中,如果没有,请允许客户端(不要感到困惑,这里的客户端表示客户端执行浏览器中的操作(使用用户名。假设我在两个表中都有两个列:
供应商表:supplier_id, supplier_username
用户表:user_id, user_username
我目前正在向数据库查询两次以检查用户名是否可用于使用。
SELECT supplier_id FROM suppliers WHERE supplier_username = ?
我获取数据后,如果有0行,则为用户表进行相同的操作,如果我获得0行,则用户名可用。
用户名必须是唯一的。
如果有更好的方法(也许是单个查询(来获得用户名是否可使用。
预先感谢!
做一个内在的联接。如果0返回,它将告诉您两个表中的记录都不存在:
SELECT COUNT(*)
FROM suppliers s
INNER JOIN users u
ON s.supplier_username = u.user_username
WHERE u.user_username = @username
表连接的限制是,一个表中的数据始终是在另一个表中的数据。为了将每个表作为其自己的数据集引用,您可以使用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 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
有几种可能的查询模式。
UNION ALL
集合运算符可以结合两个选择的结果,每个选择必须返回相同数据类型的相同数量的列和列。我们经常包含一个附加的歧视列,该列告诉我们选择了哪个返回哪个行。
例如:
( 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 = ?