簡體   English   中英

用什么加入?

[英]What join to use?

我有 2 個不同的表,它們只有一個具有相同名稱('用戶名')的字段。 他們彼此沒有關系。 我只需要對 select 進行一次查詢,其中的所有行都具有該字段等於給定值。

我想出了這個,這當然是錯誤的... SELECT * FROM user AS a FULL JOIN future_user AS b WHERE a.username=x OR b.username=x

這些我正在談論的表格:

CREATE TABLE user
(
uid      mediumint(6) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,

username varchar(15) NOT NULL,
password varchar(15) BINARY NOT NULL,
mail     varchar(50) NOT NULL,

name     varchar(50) NOT NULL,
surname  varchar(50) NOT NULL,
birth    char(10) NOT NULL,
sex      tinyint(1) unsigned NOT NULL default 1,

address  varchar(50) NOT NULL,
city     varchar(50) NOT NULL,
zip      char(5) NOT NULL,
province varchar(50) NOT NULL,
country  tinyint(3) NOT NULL,

number1  varchar(50) NOT NULL,
number2  varchar(50) NOT NULL,

last_login   TIMESTAMP,    
registered   TIMESTAMP,
online       tinyint(1) unsigned default 0,

admin           tinyint(1) unsigned default 0,
comment_allowed tinyint(1) unsigned default 0,
post_allowed    tinyint(1) unsigned default 0

) ENGINE=InnoDB;

CREATE TABLE future_user
(
username varchar(15) NOT NULL,
password varchar(15) BINARY NOT NULL,
mail     varchar(50) NOT NULL,

name     varchar(50) NOT NULL,
surname  varchar(50) NOT NULL,
birth    char(8) NOT NULL,
sex      tinyint(1) unsigned NOT NULL,

address  varchar(50) NOT NULL,
city     varchar(50) NOT NULL,
zip      char(10) NOT NULL,
province varchar(50) NOT NULL,
country  varchar(50) NOT NULL,

number1  varchar(50) NOT NULL,
number2  varchar(50) NOT NULL,

code     char(10) NOT NULL

) ENGINE=InnoDB;

使用UNION

SELECT
    fields
FROM
    user
WHERE
    user.username=x
UNION
SELECT
    fields
FROM
    future_user
WHERE
    future_user.username=x

請注意,您不能在任何一個中執行SELECT * ,因為它們具有不同的字段。 您需要從兩個子查詢中返回相同的字段。

聽起來您正在尋找的是Full Outer Join 一些數據庫系統(尤其是 MySQL)不支持這種連接。 對於那些這樣做的人,您的查詢將類似於:

SELECT * FROM user FULL OUTER JOIN future_user
  ON user.username = future_user.username;

對於那些不這樣做的人,您將不得不使用 LEFT JOIN 和 RIGHT JOIN 的 UNION,如上面鏈接的 Wikipedia 文章中所述,類似於(在 MySQL 中):

SELECT * FROM user LEFT JOIN future_user
  ON user.username = future_user.username
UNION
SELECT * FROM user RIGHT JOIN future_user
  ON user.username = future_user.username;

您可能需要認真考慮是否有可用的替代方法,例如合並表或在后端處理來自兩個單獨查詢的結果集。 FULL OUTER JOIN 使用起來非常奇怪,您最終會得到一堆 NULL 字段值,您必須檢查和驗證這些字段值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM