2014-01-08 2 views
0

Я пытаюсь прочитать все свои данные, но есть одна запись, которая находится в другой таблице. Могу ли я прочитать его вместе с моими другими записями в одном запросе?Получение записи из другой таблицы

$sql_query="SELECT * FROM blog_posts ORDER BY id DESC"; 

// table to display results here // modify here 
echo '<h1>'.$rows["title"].'</p></h1>'; 
echo '<p> '.$rows["post"].'</p>'; 
echo '<p><span class="style1">Door</span>: '.$rows["first_name"].' '; 
echo '<p>Geplaatst op</span>: '.$rows["date_posted"].'</p>';       
echo "<BR>"; 

Запись: first_name отправляется со стола: люди. Остальное - все из blog_posts.

+0

Как выглядит ваша модель данных (схема)? Разве нет внешнего ключа от «blog_posts» до (что я бы предположил, называемого) «пользователями»)? –

+1

http://dev.mysql.com/doc/refman/5.0/ru/join.html –

+0

Еще не принят ответ? –

ответ

0

Вы можете выбрать один из нескольких таблиц, как этот

$sql_query="SELECT * FROM blog_posts,people WHERE people.id=$id"; ORDER BY id DESC 
+0

Я пробовал это раньше, но потом ничего не читал. И разве этот запрос не говорит mysql, чтобы читать все из blog_posts И людей? Потому что мне нужна только одна запись от людей, first_name. –

+0

Вам также понадобится предложение where и переименование полей SELECT people.name как имя, blog_posts.title как заголовок, blog_posts.post как запись FROM blog_posts, люди WHERE blog_posts.people_id = people.id ORDER BY id DESC –

4

Используйте LEFT JOIN в запросе, как это

SELECT * FROM blog_posts 
LEFT JOIN people 
ON blog_posts.{USERIDCOLUMNNAME}=people.{USERIDCOLUMNNAME} 
ORDER BY blog_posts.id DESC; 

Или как Рауль отправил в своем комментарии определить каждый столбец:

SELECT people.name as name, blog_posts.title as title, blog_posts.post as post FROM blog_posts,people WHERE blog_posts.people_id=people.id ORDER BY id DESC 
+1

чтобы вернуть меньше полей, измените SELECT * FROM blog_posts на SELECT blog_posts. *, люди . first_name – serakfalcon

+0

Отличное дополнение @serakfalcon спасибо! :) –

+0

Что я могу добавить в пространствах {USERIDCOUMNNAME}? –

2

Назовите меня сумасшедшим, но похоже, что first_name - это поле в другой таблице, а не целая запись. Поэтому я думаю, что подход, который вы ищете, - это присоединиться к вашей таблице blog_posts с таблицей ваших людей. Как вы это делаете, хотя полностью зависит от отношений: один к одному, один-ко-многим или многие-ко-многим.

Если это один к одному (что, вероятно, нет), то у вас, скорее всего, есть внешний ключ для другой таблицы в обеих таблицах (т. Е. Есть поле blog_post.people_id и поле people.blog_post_id). Если это так, то не имеет значения, каким образом вы выполняете соединение. Так как вы уже выбрать из blog_posts таблицы, то это может выглядеть следующим образом:

SELECT * FROM blog_posts 
    INNER JOIN people ON blog_posts.people_id = people.id 

Обратите внимание, что с помощью * таким образом, при выборе будет выбрать все поля из обеих таблиц (не то, что вы хотите, скорее всего,).

Для одного-ко-многим на одном из ваших столов есть только один внешний ключ. Вероятно, это ваш случай: один человек может создавать множество статей, а отношения хранятся в поле blog_posts.person_id. В этом случае запрос выше точно такой же. Единственное различие заключается в том, что вы не можете пойти другим путем.

Для отношения «многие ко многим» вам нужно будет иметь таблицу соединений в середине между двумя таблицами (некоторые люди называют их «поворотными») таблицы). Эта таблица должна была бы только записывать как people_ids, так и blog_post_ids, и представляет собой ситуацию, когда вы позволили бы многим людям создавать одно сообщение в блоге, а один человек также был автором многих сообщений в блогах. Запрос для этого отношения будут отличаться:

SELECT * FROM blog_posts b 
    INNER JOIN blog_post_people bp ON bp.blog_post_id = b.blog_post_id 
    INNER JOIN people p ON p.people_id = bp.people_id 

Опять же, используя * здесь при выборе даст вам столбцы из всех трех таблиц, и вы, вероятно, следует избегать его использования.

+0

Да, я имел в виду поле. И я хочу читать все из 'blog_post' и только: first_name из 'people'. –

+0

Затем в вашем списке SELECT вы можете сделать: SELECT b. *, First_name FROM blog_posts b ... –

+0

+1 для отличного объяснения! Избивает мой ответ. –

Смежные вопросы