Почитал на форуме несколько тем про промежуточные таблицы и не совсем допонял.
Создал таблицы:
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 связаны), просто дело в том, что у видео несколько, скажем так, жанров, и чтобы не дублировать, создал промежуточную, а как вывести через неё, связать вместе все три, не лезет мысть в голову, на языке крутиться и не могу связать
Спустя 2 часа, 12 минут, 17 секунд (4.01.2012 - 21:05) killer8080 написал(а):
Если ничего не напутал, то так
где cat2video твоя 3-я таблица.
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
Спасибо
LEFT JOIN вроди используется для сохранения переносимости кода между различными базами данных
А верхняя строка находит все строки в таблице v с величиной id вроди
По моему как то так чтоли, больше не могу понял, ни разу не сталкивался с таким.
Help Help me
Спустя 13 минут, 3 секунды (4.01.2012 - 23:42) killer8080 написал(а):
hamado
прочитай про group_concat() и сразу все станет ясно
прочитай про group_concat() и сразу все станет ясно
Спустя 13 минут, 25 секунд (4.01.2012 - 23:55) killer8080 написал(а):
hamado
ты пробовал выполнить этот запрос в PMA? Работает?
ты пробовал выполнить этот запрос в PMA? Работает?
Спустя 8 минут, 7 секунд (5.01.2012 - 00:03) veolancer написал(а):
Я не особо опытный в это, что такое PMA?
Я на данный момен просто вывожу видео используя 2 таблицы без промежуточной, связываю полем cat в табличке video, вчера в этой самой промежуточной(назвал её int) поприсваивал видео категоии к которым они подходят.
Я на данный момен просто вывожу видео используя 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)
Как то так
структура таблиц.
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 | мелодрама
Объяснил как мог, думаю достаточно разжёвано.
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`? И как мне потом выводить это всё дело, к каким переменным обращаться то?
Спустя 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 буду обращаться, но что там лежать будет?.. Вот вопрос
1)cat -категории (поля: id, title)
2)int -промеж. (поля: cat_id, video_id)
3)video -видео, вся инфа (поля допустим: id, title, text, code)
Вот с этими полями хотяб, чтоб по-понятней
Запрос у меня будет приерно такой..
$querye = mysql_query (" ";)
По идее я к $querye буду обращаться, но что там лежать будет?.. Вот вопрос
Спустя 34 минуты, 24 секунды (5.01.2012 - 23:45) veolancer написал(а):
А вообще такой вопрос ко всем: Стоит ли создать такого рода таблицу? Раз она создаёт дубли.
Спустя 56 минут, 45 секунд (6.01.2012 - 00:41) killer8080 написал(а):
Цитата (hamado @ 5.01.2012 - 22:45) |
Стоит ли создать такого рода таблицу? Раз она создаёт дубли. |
Никаких дублей тут нет. Это называется отношение один к многим.
Спустя 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
блин ну ты даешь
$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
Прости друган. двое суток не спал , а тут ещё задачка такая привалила, ты подсказал запрос в начале, и я вот начал рыть у себя в справочниках, в инете перерывал инфу о такова рода запросах и что вообще означает то, или иное слово. Сам уже начал догонять(проговаривать) как тут и что.
Спасибо тебе огромное, сейчас твой последний ответ разбиру и под себя попытаюсь подогнать.
Прости друган. двое суток не спал , а тут ещё задачка такая привалила, ты подсказал запрос в начале, и я вот начал рыть у себя в справочниках, в инете перерывал инфу о такова рода запросах и что вообще означает то, или иное слово. Сам уже начал догонять(проговаривать) как тут и что.
Спасибо тебе огромное, сейчас твой последний ответ разбиру и под себя попытаюсь подогнать.
Спустя 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 написал(а):
А теперь я в стопоре откуда взялись поля `cat`.`title`
Цитата (hamado @ 4.01.2012 - 21:09) |
объединенные через запятую, поле категорий |
в категории ведь поля id и title
По-любому кто читает этот топик просто орут надомной, блин просо серъёзно что то понял, что то нет, а понял ой как охота
Спустя 1 час, 23 минуты, 28 секунд (7.01.2012 - 00:21) killer8080 написал(а):
Цитата (hamado @ 6.01.2012 - 21:58) |
А теперь я в стопореоткуда взялись поля `cat`.`title` |
Таблица `cat`, поле `title`. Когда в запросе участвуют несколько таблиц, нужно обязательно указывать принадлежность поля к таблице
Спустя 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`
Вместо названия, для сокращения записи может быть использован псевдоним.