Что присоединиться к использованию? - PullRequest
0 голосов
/ 31 мая 2011

У меня есть 2 разные таблицы, в которых есть только одно поле с одинаковым именем («имя пользователя»). Они не связаны друг с другом. Мне нужно всего одним запросом выбрать все строки среди них, у которых это поле равно заданному значению.

Я придумал это, что, конечно, неправильно ... ВЫБЕРИТЕ * ОТ ПОЛЬЗОВАТЕЛЯ КАК ПОЛНОСТЬЮ СОЕДИНЕНИЯ

Вот таблицы, о которых я говорю:

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;

Ответы [ 2 ]

5 голосов
/ 31 мая 2011

Используйте UNION:

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

Обратите внимание, что вы не можете сделать SELECT * в любом из них, потому что они имеют разные поля. Вам нужно будет вернуть одинаковые поля из обоих подзапросов.

0 голосов
/ 31 мая 2011

Звучит так, как будто вы ищете Full Outer Join .Некоторые системы баз данных (особенно MySQL) не поддерживают такие объединения.Для тех, кто делает, ваш запрос будет выглядеть примерно так:

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

Для тех, кто этого не делает, вам придется использовать UNION из LEFT JOIN и RIGHT JOIN, как объяснено в статье Википедии, ссылки на которую приведены выше.что-то вроде (в 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, которые вы должны будете проверить и проверить.

...