Попытка выбрать каждую комбинацию из двух таблиц со значениями по умолчанию - PullRequest
2 голосов
/ 12 февраля 2012

У меня есть структура таблицы, подобная следующей:

table a:
id int
name varchar

table b:
id int
name varchar

table c:
id int
valid tinyint
table_a int
table_b int

По сути, таблица c отображается между таблицами a и b, а также имеет столбец, чтобы определить, является ли что-то действительным (1 или 0).Я хочу иметь возможность выбрать каждое имя (только один раз) из таблицы a и связанный столбец 'valid' из таблицы c (и значение по умолчанию 0, если оно не существует) и ограничить его путем сопоставления table_b с идентификатором.Надеюсь, это имеет смысл.


Вот некоторые примеры данных, которые помогут показать, что я имею в виду:

Используя структуру таблицы, как указано выше, у меня есть эти данные:

Table a:
(id, name)
1, row 1
2, row 2
3, row 3

Table b:
(id, name)
1, row a
2, row b

Table c:
(id, valid, table_a, table_b)
1, 1, 1, 1

Теперь я хочу выбрать все имена из таблицы a, столбец 'valid' из c (по умолчанию 0, если ни одна строка не соответствует) и ограничить поля 'valid' только теми, которые table_b = 1.Надеюсь, это имеет больше смысла?

Итак, я хочу вернуть следующее, где b.id = 1:

(a.name, c.valid)
row 1, 1
row 2, 0
row 3, 0

Ответы [ 3 ]

0 голосов
/ 12 февраля 2012

Надеюсь, запрос является самообоснованным:

SELECT * 
FROM 
  a LEFT OUTER JOIN c ON a.id = c.table_a 
    LEFT OUTER JOIN b ON c.table_b = b.id
WHERE c.valid = 1
0 голосов
/ 12 февраля 2012

Дай мне посмотреть, понял ли я.Вы ищете что-то вроде этого?

Этот запрос:

select a.name, coalesce(c.valid, 0) as IsValid, b.id from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b

Результаты в этом:

NAME    ISVALID ID
row 1   1       1
row 2   0   
row 3   0   

Если вы хотите все b.id = 1, то вы не будетеесть ВСЕ строки из table_a.

select a.name, coalesce(c.valid, 0) as IsValid from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b
where b.id = 1

NAME    ISVALID ID
row 1   1       1
0 голосов
/ 12 февраля 2012
SELECT
  a.name,
  IFNULL(c.valid,0) AS valid
FROM
  a
  LEFT JOIN c on a.id=c.table_a
WHERE 
  c.table_b=<your-id-as wanted>
  OR c.table_b IS NULL
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...