MySQL оставил присоединиться к вопросу - PullRequest
1 голос
/ 30 августа 2011

Я хочу заставить запрос выбрать все имена из таблицы 'a', где из таблицы 'b' у меня есть id_one = '3'. id_two - это id записи из таблицы 'a', две записи имеют отношение из id_one = '3'. Как я могу сделать запрос?

CREATE TABLE IF NOT EXISTS `a` (
  `id` int(11) NOT NULL,
  `name` varchar(11) NOT NULL,
  `value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `a`
--

INSERT INTO `a` (`id`, `name`, `value`) VALUES
(1, 'lalala', 0),
(2, 'allalala', 0);






CREATE TABLE IF NOT EXISTS `b` (
  `id_one` int(11) NOT NULL,
  `id_two` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `b`
--

INSERT INTO `b` (`id_one`, `id_two`) VALUES
(3, 1),
(3, 2);

Ответы [ 4 ]

3 голосов
/ 30 августа 2011

Это то, что вы хотите:

select Name
from a inner join b on a.id = b.id_two
where b.id_one = 3
0 голосов
/ 30 августа 2011
select Name
from a join b on a.id = b.id_two
where b.id_one = 3;

Также будет работать, чтобы получить ваш ответ.Могу ли я также предложить вам значительно улучшить свои операторы создания таблиц, включив в них индексацию.EG

CREATE TABLE IF NOT EXISTS `a` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(11) NOT NULL,
 `value` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `b` (
  `id_one` bigint(20) NOT NULL,
  `id_two` bigint(20) NOT NULL,
  KEY `FKCAFBB09382DEAC` (`id_one`),
  CONSTRAINT `b_a_1` FOREIGN KEY (`id_two`) REFERENCES `a` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Я бы также использовал bigint для первичных ключей и использовал charset = utf8
. В наши дни принято переводить приложение на многоязычный язык.ИМХО

0 голосов
/ 30 августа 2011

В заголовке вашего вопроса упоминаются левые объединения, но вам не нужно левое объединение, чтобы выполнить запрос, который вы описали.

Левые объединения хороши для поиска вещей, которые не соответствуют тому, как выожидать.Таким образом, использование левого соединения в этом случае зависит от того, что вы ищете.Если вы ищете записи b.id_two, которые не имеют соответствующих записей в таблице a,

select Name, b.* from b left join a on a.id = b.id_two 

Это даст вам таблицу, в которой перечислены все строки таблицы b с NULL вместо имен длястол, где нет совпадений.

Аналогичным образом, если вы ищете имена, которые не имеют записей в b.id_two, вы должны использовать

select Name, b.* from a left join b on a.id = b.id_two 

Если вы хотите обеспечить, чтобы всегда была переписка, выможет определить ограничение внешнего ключа между родительской и дочерней таблицей.

0 голосов
/ 30 августа 2011

извините, я не до конца понимаю ваши схемы или ваш вопрос, но я думаю, что вы пытаетесь спросить:

SELECT * FROM a 
JOIN b on a.id = b.id_two;

Попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...