Какой тип соединения использовать? - PullRequest
0 голосов
/ 30 января 2009

У меня есть таблица с именем PROJECT_CATEGORY, и она содержит два поля

cat_id и cat_title

Я храню cat_id в другой таблице с именем PROJECTS, поэтому:

project_category.cat_id = projects.cat_id

Как лучше всего использовать MySQL для запуска запроса, чтобы показать cat_title. Другими словами, я хочу отобразить имя, а не идентификационный номер таблицы. Будет ли это работать:

SELECT * FROM projects INNER JOIN projects ON project_category.cat_id = projects.cat_id

Тогда назовите это:

'.$row['cat_title'].'

Есть мысли?

Ответы [ 6 ]

1 голос
/ 30 января 2009

Старайтесь не использовать SELECT *, вместо этого выберите нужные вам поля. Кроме того, если вы используете несколько таблиц в запросе, присвойте им псевдонимы, чтобы вы могли извлекать значения по мере необходимости и не сталкиваться с проблемами неопределенности.

В любом случае, вы можете попробовать что-то вроде:

SELECT       
 project_category.cat_title 
 ,projects.*  
FROM   
 projects   
  LEFT OUTER JOIN     
   project_category
    ON project_category.cat_id = projects.cat_id
1 голос
/ 30 января 2009

Если каждый проект имеет действительный cat_id и cat_id уникален, то INNER JOIN в порядке.

Если у какого-либо проекта есть NULL cat_id, вам нужно LEFT JOIN.

Если cat_id не является уникальным полем (первичным ключом), вы можете использовать подзапрос, чтобы ограничить себя одним результатом на проект.

0 голосов
/ 28 января 2011

Вы можете использовать NATURAL JOIN:

SELECT CAT_TITLE
FROM projects
NATURAL JOIN project_category

Если столбцы одного типа и не равны NULL, нет необходимости помещать поля в объединение, и оно будет работать нормально.

0 голосов
/ 30 января 2009

Ваше объединение выглядит хорошо. FWIW, я бы использовал предложение USING в этом случае. Он работает так же, но немного яснее и лаконичнее:

SELECT * FROM projects INNER JOIN project_category USING (cat_id);

Если у вас возникли проблемы с поиском столбца в ассоциативном массиве $row, я бы проверил написание вашего определения столбца, включая использование заглавных букв. Если вы объявили свою таблицу таким образом:

CREATE TABLE `Project_Category` (
  `Cat_ID`    INTEGER NOT NULL,
  `Cat_Title` VARCHAR(20) NOT NULL
);

Тогда результирующий набор может использовать это буквальное написание и заглавные буквы в ключах массива. Ключи массива PHP чувствительны к регистру.

print $row['Cat_Title'];

Вам, вероятно, следует выгрузить массив $row, чтобы узнать, каковы его ключи:

print_r($row);
0 голосов
/ 30 января 2009
SELECT cat_title 
FROM projects 
    INNER JOIN project_category ON project_category.cat_id = projects.cat_id

Это должно сработать.

0 голосов
/ 30 января 2009
SELECT
  projects.cat_id cat_id
FROM
  projects INNER JOIN
  project_category ON project_category.cat_id = projects.cat_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...