[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Промежуточная таблица
veolancer
Всем привет.! :)
Почитал на форуме несколько тем про промежуточные таблицы и не совсем допонял.

Создал таблицы:
1 - cat(2 поля(id, title))
2 - video (около 10 полей(id, title, view, text и т.д.))
И 3 промежуточная (2 поля(video_id(записывается ид самого видео) и cat_id(сюда присваиваю категорию)))

Так вот, структура сайта такая, слева-китегории, справа-инфо о видео и ссылка на просмотр, в этом же файле открывается само видео. Запросы выполнены следующим образом:

1-На категории

<?php

$query_cat = mysql_query("
SELECT *
FROM `cat`
ORDER BY `title`"
)
or die(mysql_error());

?>


2-Пока такой. Это на вывод видео для просмотра

<?php

$query_video = mysql_query("
SELECT *
FROM `video`
WHERE `cat`="
. (int)$cat ."
ORDER BY `id` DESC"
)
or die(mysql_error());

?>


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

ps: всегда не обращал особо внимания, но пользуясь моментом хочу спросить, для чего нужен символ ` в sql запросе?, пробовал и без них, вроди работает.



Спустя 2 часа, 53 минуты, 21 секунда (4.01.2012 - 17:09) killer8080 написал(а):
Цитата (hamado @ 4.01.2012 - 13:16)
ps: всегда не обращал особо внимания, но пользуясь моментом хочу спросить, для чего нужен символ ` в sql запросе?, пробовал и без них, вроди работает.

Обратные кавычки выделяют названия таблиц и полей. Обязательны они только если эти имена совпадают с зарезервированными словами SQL. Плюс их наличие упращает СУБД разбор запроса. Считается хорошим стилем их использовать всегда.
Цитата (hamado @ 4.01.2012 - 13:16)
Таблицу промежуточную создал, подготовил, заполнил, а как правильно запрос сейчас сделать в голову не приходит, подскажите, буду очень благодарен.!

а что ты хочешь вывести?

Спустя 1 час, 43 минуты, 37 секунд (4.01.2012 - 18:53) veolancer написал(а):
Я в цикле while вывел из таблицы 'cat' категории, справа так же в цикле вывел из video краткое описание видео(у меня таблица cat и video связаны), просто дело в том, что у видео несколько, скажем так, жанров, и чтобы не дублировать, создал промежуточную, а как вывести через неё, связать вместе все три, не лезет мысть в голову, на языке крутиться и не могу связать smile.gif

Спустя 2 часа, 12 минут, 17 секунд (4.01.2012 - 21:05) killer8080 написал(а):
Если ничего не напутал, то так
SELECT `v`.*, GROUP_CONCAT(`c`.`title`) AS `cats`
FROM `video` `v`
LEFT JOIN `cat2video` `cv` ON `cv`.`video_id` = `v`.`id`
LEFT JOIN `cat` `c` ON `c`.`id` = `cv`.`cat_id`
GROUP BY `v`.`id`

где cat2video твоя 3-я таблица.

Спустя 2 часа, 23 минуты, 35 секунд (4.01.2012 - 23:29) veolancer написал(а):
Ох блин, ещё бы разобраться в этом коде. Не мог бы ты описать его, разжувать для меня что тут к чему. А точнее проговорить.
Спасибо

LEFT JOIN вроди используется для сохранения переносимости кода между различными базами данных
А верхняя строка находит все строки в таблице v с величиной id вроди

По моему как то так чтоли, больше не могу понял, ни разу не сталкивался с таким.

Help Help me blink.gif

Спустя 13 минут, 3 секунды (4.01.2012 - 23:42) killer8080 написал(а):
hamado
прочитай про group_concat() и сразу все станет ясно wink.gif

Спустя 13 минут, 25 секунд (4.01.2012 - 23:55) killer8080 написал(а):
hamado
ты пробовал выполнить этот запрос в PMA? Работает?

Спустя 8 минут, 7 секунд (5.01.2012 - 00:03) veolancer написал(а):
Я не особо опытный в это, что такое PMA?

Я на данный момен просто вывожу видео используя 2 таблицы без промежуточной, связываю полем cat в табличке video, вчера в этой самой промежуточной(назвал её int) поприсваивал видео категоии к которым они подходят.

Спустя 4 минуты, 27 секунд (5.01.2012 - 00:08) killer8080 написал(а):
Цитата (hamado @ 4.01.2012 - 23:03)
что такое PMA?

phpMyAdmin
Цитата (hamado @ 4.01.2012 - 23:03)
Я на данный момен просто вывожу видео используя 2 таблицы без промежуточной, связываю полем cat в табличке video, вчера в этой самой промежуточной(назвал её int) поприсваивал видео категоии к которым они подходят.

так таблица есть?

Спустя 1 минута, 30 секунд (5.01.2012 - 00:09) veolancer написал(а):
Почитал сейчас статью и немного коментов, честно сказать не совсем понял, он как бы создаёт sql запрос в другом sql запросе, так? и как это мне получается соединить.

структура таблиц.

1) cat(id(первичный), title)
2) video(id(первичный),title,text,code,img,author,cat,genre)
3) Промеж. int(cat_id, video_id)

Как то так

Спустя 40 минут, 37 секунд (5.01.2012 - 00:50) killer8080 написал(а):
Допустим есть таблица video с таким содержимым
id | name
1 | Матрица
2 | Терминатор
3 | Унесенные ветром

есть таблица жанров
id | name
1 | мелодрама
2 | боевик
3 | фантастика

есть сводная таблица video2cat
video_id | cat_id
1 | 2 // Матрица - боевик
1 | 3 // Матрица - фантастика
2 | 2 // Терминатор - боевик
3 | 1 // Унесенные ветром - мелодрама

Сначала идет выборка из таблицы video
FROM `video` `v`
затем объединение с cat2video по совпадению полей
LEFT JOIN `cat2video` `cv` ON `cv`.`video_id` = `v`.`id`
поскольку таблицы пересекаются, из таблицы видео одни и те же ряды выведутся столько раз, сколько вхождений они имеют в сводной таблице. Т.е. вместе с ещё одним джойном получим такой вывод
1 | Матрица | 2 | боевик
1 | Матрица | 3 | фантастика
2 | Терминатор | 2 | боевик
3 | Унесенные ветром | 1 | мелодрама
Дубляж устраняется группировкой по таблице видео
GROUP BY `v`.`id`
вывод будет выглядеть так
1 | Матрица | 2 | боевик
2 | Терминатор | 2 | боевик
3 | Унесенные ветром | 1 | мелодрама
Т.е дубляжа нет, но и категория выводится только одна, чтоб этого не было, и нужна group_concat
SELECT `v`.*, GROUP_CONCAT(`c`.`title`) AS `cats`
тут выводятся все поля из таблицы видео, и объединенные через запятую, поле категорий
1 | Матрица | 2 | боевик,фантастика
2 | Терминатор | 2 | боевик
3 | Унесенные ветром | 1 | мелодрама

Объяснил как мог, думаю достаточно разжёвано.

Спустя 20 минут, 31 секунда (5.01.2012 - 01:10) veolancer написал(а):
А откуда взялись поля `v` и `c` и `cv`? blink.gif И как мне потом выводить это всё дело, к каким переменным обращаться то?

Спустя 12 часов, 11 минут, 35 секунд (5.01.2012 - 13:22) killer8080 написал(а):
Цитата (hamado @ 5.01.2012 - 00:10)
А откуда взялись поля `v` и `c` и `cv`?И как мне потом выводить это всё дело, к каким переменным обращаться то?

Это не поля, это псевдонимы (alias), чтобы не писать длинное слово video, назначаем ему короткий псевдоним v. Вместо
SELECT `v`.*, GROUP_CONCAT(`c`.`title`) AS `cats`
можно было написать полностью
SELECT `video`.*, GROUP_CONCAT(`cat`.`title`) AS `cats`
Это нужно только для сокращения записи. Кстати выводу group_concat то же назначен alias - cats. Доступ к нему будет в php через $row['cats'], остальные поля - как обычно.

Спустя 9 часов, 48 минут, 22 секунды (5.01.2012 - 23:10) veolancer написал(а):
Блин, один фиг не усвоилось. Ты напиши запрос с именами моих таблиц, чтоб я понял, без всяких сокращёнок и как мне потом обратиться чтоб из cat вывести видео(название и т.д.)

1)cat -категории (поля: id, title)
2)int -промеж. (поля: cat_id, video_id)
3)video -видео, вся инфа (поля допустим: id, title, text, code)

Вот с этими полями хотяб, чтоб по-понятней

Запрос у меня будет приерно такой..
$querye = mysql_query (" ";)

По идее я к $querye буду обращаться, но что там лежать будет?.. Вот вопрос unsure.gif

Спустя 34 минуты, 24 секунды (5.01.2012 - 23:45) veolancer написал(а):
А вообще такой вопрос ко всем: Стоит ли создать такого рода таблицу? Раз она создаёт дубли.

Спустя 56 минут, 45 секунд (6.01.2012 - 00:41) killer8080 написал(а):
Цитата (hamado @ 5.01.2012 - 22:45)
Стоит ли создать такого рода таблицу? Раз она создаёт дубли.

Никаких дублей тут нет. Это называется отношение один к многим. wink.gif

Спустя 44 минуты, 20 секунд (6.01.2012 - 01:26) veolancer написал(а):
killer8080

Выше был вопрос тебе, про запрос, ответишь?

Спустя 11 часов, 27 минут, 5 секунд (6.01.2012 - 12:53) killer8080 написал(а):
Цитата (hamado @ 6.01.2012 - 00:26)
killer8080

Выше был вопрос тебе, про запрос, ответишь?

hamado
блин ну ты даешь user posted image
$result = mysql_query("
SELECT `video`.*, GROUP_CONCAT(`cat`.`title`) AS `categories`
FROM `video`
LEFT JOIN `int` ON `int`.`video_id` = `video`.`id`
LEFT JOIN `cat` ON `cat`.`id` = `int`.`cat_id`
GROUP BY `video`.`id`
"
);
echo '<table border="1">';
$i = 1;
while($row = mysql_fetch_assoc($result)){
if($i++ == 1)
echo '<tr><th>'.implode('</th><th>', array_keys($row)).'</th></tr>';
echo '<tr><td>'.implode('</td><td>', $row).'</td></tr>';
}
echo '</table>';

Спустя 8 часов, 58 секунд (6.01.2012 - 20:54) veolancer написал(а):
killer8080

Прости друган. двое суток не спал blink.gif , а тут ещё задачка такая привалила, ты подсказал запрос в начале, и я вот начал рыть у себя в справочниках, в инете перерывал инфу о такова рода запросах и что вообще означает то, или иное слово. Сам уже начал догонять(проговаривать) как тут и что.

Спасибо тебе огромное, сейчас твой последний ответ разбиру и под себя попытаюсь подогнать. smile.gif

Спустя 4 минуты, 30 секунд (6.01.2012 - 20:58) veolancer написал(а):
А слушай, тобишь в переменной $result будет весь массив из таблички video, и потом т.е. после перевода обращаюсь как обычно к строке по переменной row, так я понял? И как допустим вывести мне ни Все поля а некоторые?

Спустя 10 минут, 3 секунды (6.01.2012 - 21:08) killer8080 написал(а):
Цитата (hamado @ 6.01.2012 - 19:58)
А слушай, тобишь в переменной $result будет весь массив из таблички video

Никакого массива там нет, mysql_query() возвращает указатель на ресурс БД при корректном запросе, и false в случае ошибки. Функция mysql_fetch_assoc в цикле while, будет дергать ряд, за рядом пока не вытащит все данные, которые сформировал запрос.
Цитата (hamado @ 6.01.2012 - 19:58)
И как допустим вывести мне ни Все поля а некоторые?

Укажи их в явном виде, вместо маски *.

Спустя 50 минут, 30 секунд (6.01.2012 - 21:59) veolancer написал(а):
Цитата (hamado @ 6.01.2012 - 17:58)
Никакого массива там нет, mysql_query() возвращает указатель на ресурс БД при корректном запросе, и false в случае ошибки. Функция mysql_fetch_assoc в цикле while, будет дергать ряд, за рядом пока не вытащит все данные, которые сформировал запрос.


Ну это то я знаю.

Я имею ввиду что запрос в эхе у меня будет примерно такой?


<?php

echo 'Название видео - '. htmlspecialchars($row['title']) .' и бла бла бла';

?>

Спустя 14 минут, 19 секунд (6.01.2012 - 22:13) killer8080 написал(а):
Цитата (hamado @ 6.01.2012 - 20:59)
Я имею ввиду что запрос в эхе у меня будет примерно такой?


<?php

echo 'Название видео - '. htmlspecialchars($row['title']) .' и бла бла бла';

Ну да, элементы массива будут называться так же, как поля в БД. Исключение расчетный столбец, для тог чтоб к нему было удобно обращаться, ему назначаем alias - `categories`

Спустя 3 минуты, 24 секунды (6.01.2012 - 22:16) veolancer написал(а):
В смысле, как понял расчётный это ид, тоесть ид'у мы дадим псевдоним `categories` ?

Спустя 3 минуты, 9 секунд (6.01.2012 - 22:20) killer8080 написал(а):
Расчетный, потому что вместо реального поля `cat`.`title`, мы подставляем вывод функции group_concat(), которая выведет через запяту, ячейки `cat`.`title`, скрытые группированием.

Спустя 38 минут, 21 секунда (6.01.2012 - 22:58) veolancer написал(а):
А теперь я в стопоре biggrin.gif откуда взялись поля `cat`.`title`

Цитата (hamado @ 4.01.2012 - 21:09)
объединенные через запятую, поле категорий

в категории ведь поля id и title

По-любому кто читает этот топик просто орут надомной, блин просо серъёзно что то понял, что то нет, а понял ой как охота smile.gif

Спустя 1 час, 23 минуты, 28 секунд (7.01.2012 - 00:21) killer8080 написал(а):
Цитата (hamado @ 6.01.2012 - 21:58)
А теперь я в стопореоткуда взялись поля `cat`.`title`

Таблица `cat`, поле `title`. Когда в запросе участвуют несколько таблиц, нужно обязательно указывать принадлежность поля к таблице wink.gif

Спустя 6 минут, 17 секунд (7.01.2012 - 00:28) veolancer написал(а):
т.е. если полей больше, то через запятую я их указываю, верно?

Спустя 10 минут, 56 секунд (7.01.2012 - 00:39) killer8080 написал(а):
По правилам в начале название таблицы, затем через точку, название поля. Когда работаешь с одной таблицей, название таблицы можно опустить, например
SELECT `title` FROM `cat`

или
SELECT `cat`.`title` FROM `cat`

Вместо названия, для сокращения записи может быть использован псевдоним.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.