Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Двойной запрос mysql (https://javascript.ru/forum/server/34155-dvojjnojj-zapros-mysql.html)

Mateus 22.12.2012 01:08

Двойной запрос mysql
 
С наступающими праздниками!
Как обледененить 2 запроса mysql в один?

"SELECT `photo_id` FROM `like` where `user_id`= $user_id",

SELECT * FROM `photo` where `user_id`= $user_id


В одной таблице хранится значение photo_id, затем из второй таблицы достаю строку, где photo_id = photo_id.

Gozar 22.12.2012 10:40

Цитата:

Сообщение от Mateus
Как обледененить 2 запроса mysql в один?

Как минимум тремя способами:

Таблица `basic` - основная (твоя `photo`)
Таблица `user_basic` - пользовательские действия связанные с basic (у тебя вроде бы `like`)

$user_id = (int)$user_id;

1. Самый быстрый.
"SELECT `basic`.`id` FROM `basic`,`user_basic` WHERE `basic`.`id`=`user_basic`.`basic_id` AND `user_basic`.`id`=$user_id"


2. Через подзапрос, более внятно написанное, что и выше, но с подзапросом.
"SELECT `id` FROM `basic` WHERE `id` = (SELECT `basic_id` FROM `user_basic` WHERE `id`=$user_id)"


3. Через склейку(объединение таблиц). Пожалуй самый долгий, но иногда нужен именно этот.
"SELECT `basic`.`id` FROM `basic` LEFT OUTER JOIN `user_basic` ON `basic`.`id`=`user_basic`.`basic_id` WHERE `user_basic`.`id`=$user_id"

JOIN-ами можно ещё пару запросов реализовать, но думаю тебе и этого должно хватить.

ps: Не называй таблицы `like` эдак и рёхнуться можно.

Mateus 22.12.2012 18:15

У меня получилось так :
if ($result = $mysqli->query("SELECT `id` FROM `photo` WHERE `id` = (SELECT `photo_id` FROM `like` WHERE `user_id`=$user_id)", MYSQLI_USE_RESULT)) {

Но mysql возвращает ошибку №1242.
#1242 - Subquery returns more than 1 row

Как правильно выбрать? Т.к. дальше $row пустой

while ($row = $result->fetch_object())

Gozar 22.12.2012 18:49

Цитата:

Сообщение от Mateus
Subquery returns more than 1 row

Подзапрос вернул более 1 строки.

Выборка совпадает с несколькими строками. У тебя подзапрос возвращает список идешников. Поэтому ты либо неправильно формулируешь вопрос, либо у тебя кривая реализация.

Используй первый вариант, должно помочь.

$result->fetch()

$result->execute();
не забыл? Частая ошибка.

Gozar 22.12.2012 18:55

И давай поподробней строение таблиц и что находиться в одной таблице, а что в другой и что нужно получить. Не надо писать запросами. Напиши словами.

Mateus 22.12.2012 21:03

В таблице like находится photo_id и user_id,
в таблице photo находится вся информация касательно фотографии, т.е. url, id, title, date и т.д.

Необходимо отобразить все данные фотографии ( из таблицы photo ), у которых автор $user_id ( в таблице `like` )

Gozar 22.12.2012 21:25

Mateus,
И чем тебе первый запрос не подошел?
"SELECT `photo`.`id` FROM `photo` , `like` WHERE `photo`.`id` = `like`.`photo_id` AND `like`.`user_id` = $user_id"

Mateus 24.12.2012 13:21

Немного поразмыслив и переделав запрос, получи необходимую информацию.
Огромное спасибо Вам, Gozar, и с Рождеством!

n2011all 08.03.2016 16:58

прошу подробнее
 
та же история - прошу ответить чисто теоретически
Субд MySql в базе base следующие таблицы
tab1 в ней поле а
tab2 в ней поле в
Вопрос-как правильно записать (язык рнр)
вставку (может обновление) в общем перенести (записать)
в поле (в tab2) значения поля (а tab1) для определенных рядом условий строк)
какой код нужен чтобы при внесении данных в поле (а tab1), автоматически изменялось и значение данных в поле (в tab2)
Варианты ???
Спасибо заранее за консультацию.

n2011all 08.03.2016 17:58

прошу подробнее
 
Уточню вопрос
Версия PHP: 5.6.11-1ubuntu3.1
Версия Mysql: 5.6.28-0ubuntu0.15.10.1
Необходимо на языке РНР в правильном синтаксисе
составить запрос (или их комбинацию),чтобы
в одной и той же базе-base
в поле a tabl1,отвечающего условиями S11,S12
записать значение
из поля b tabl2,отвечающего условиям S21,S22
код нужен только для запросов.
И есть ли разница этой задачи от подобной,
но подразумевающей автоматическое заполнение
значений поля a tabl1,отвечающего условиями S11,S12
при вводе через форму
значений в поле b tabl2,отвечающего условиям S21,S22

laimas 08.03.2016 18:22

Цитата:

Сообщение от n2011all
та же история - прошу ответить чисто теоретически

То есть выборка данных и запись это одно и тоже? Нельзя произвести запись одновременно в несколько таблиц. Есть триггеры и это вся теория, ибо что за условия S11,S12 только богу известно.

n2011all 08.03.2016 18:54

Это принципиальное ограничение :"Нельзя произвести запись одновременно в несколько таблиц" ?
Хорошо, а какие есть принципиальные ограничения в синтаксиcе СУБД MySQL
на комбинацию запросов
Например-можно ли комбинировать все запросы со всеми ?
Или есть только (назовем так совместимые) пары (типа Insert..Select)
Какова вложенность запросов-например
запро1 -получает значение из (запроса2-который в свою очередь получает значение из (запроса3-который---Nраз повторенная конструкция вложенности---)
Дело в том что на досуге почитывая документацию на сайте оракла так и не нашел ответ на эти вопросы...
Например в таких СУБД как oracle, vsfoxpro, ms access в документации указано на отсутствие ограничений на вложенность запросов,но есть ограничения на совместную совместимость типов запросов...
В общем интересно Ваше мнение - есть ли принципиальная возможность автоматического заполнения полей одной таблицы данными из другой таблицы ВНИМАНИЕ !!! без хранимых процедур, А ТОЛЬКО КОМБИНАЦИЕЙ ЗАПРОСОВ.
Если есть- прошу указать доп ссылки где посмотреть, или привести пример на простом примере (например изложенном в посте выше)
Буду очень благодарен (и да, давайте абстрагируемся от сложности условий, будем считать их тривиальными - например запись удовлетворяющая условию для n=10 строк)
Спасибо за внимание.

laimas 09.03.2016 12:31

Цитата:

Сообщение от n2011all
Это принципиальное ограничение :"Нельзя произвести запись одновременно в несколько таблиц" ?

Разве трудно абстрагироваться от базы и представить жизненную ситуацию, ведь в работу СУБД закладывается логика?

Сообразили на троих, послали одного в магазин за выпивкой, не зная при этом есть ли она в продаже. Вопрос - логично ли сразу оставшимся идти покупать закуску, или же дождаться первого и по результату его похода в магазин решать идти за закуской или нет?

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

Кроме этого, в процессе записи/обновления СУБД использует блокировку, поэтому, к примеру, нельзя в запросе обновления указать использование некоторого обновляемого значения.

В СУБД нет понятия комбинации запросов, есть понятие вложенных запросов, объедение таблиц в запросах различными операторами. Всего рассказать просто не возможно, и учить все это придется самому. В помощь, но не в теории (никто вам лекции читать не будет), а по конкретным вопросам лучше на специализированный по СУБД форум, уж больно обширный не только материал, но и отличия в различных СУБД, тонкости и фичи разные.

Что же касается сути из таблицы А в таблицу В, то нужно описывать конкретные условия. Если две таблицы должны иметь идентичные параметры неких данных, то нужно просто делать два SQL запроса. Триггеры в SQL, это не страшилка, а удобная вещь как раз подобных задач.

n2011all 18.03.2016 12:36

ok спасибо за доступно-постижимый ответ :)
Увы, Вы оправдали мои опасения насчет регламентированости и лимитированности в целом любых СУБД....
Обращаясь к Вашей аналогии насчет третьего - действительно в СУБД (и я подозреваю,что в любых) не предусмотрена параллельность логик.
Для нас,людей, естественно банальной считается логика ВЕРЫ в возвращаемость "третьего", и потому необходимость действий (приготовление закуски или как минимум стаканов) параллельных процессу движения "третьего". Спасибо за участие в диалоге.


Часовой пояс GMT +3, время: 07:33.