один SQL-запрос для извлечения результатов из таблиц с отношением «многие-многие»

0

У меня есть таблица с именем IMAGES, в которой есть имя атрибута img_ID, который является основным ключом,

есть другая таблица с именем Избранное, в которой есть два атрибута: img_ID и user_ID... img_ID служит для внешнего ключа для изображения и user_ID для пользователя <

СЕЙЧАС мне нужны детали из ИЗОБРАЖЕНИЙ всех img_ID из Избранное, где user_ID - это некоторое значение x

это я мог бы сделать так: b.t.w Я использую PHP и mySQL

$gett = mysql_query("SELECT img_ID FROM favorites WHERE user_ID='".$variable."'");

if( mysql_num_rows($gett) > 0 )
{
  while( $steps = mysql_fetch_assoc($gett) )
  {
     $res = mysql_query("SELECT * FROM images WHERE img_ID='".$steps['img_ID']."' ORDER BY img_Date");

         if( mysql_num_rows($res) > 0 )
         {
            while( $result= mysql_fetch_assoc($res) )
            {
               echo $result['img_Name'];
               echo $result['img_Desc'];
               echo $result['img_ext'];
            }
         else 
            echo "no images were found";
  }
}
else 
  echo "no favorites were found";

КОД PSEUDO будет похож на

RUN QUERY
for each img_ID where user_ID is this
    RUN QUERY    
    for each img_ID
        perform DISPLAY

Эта методология имеет недостаток и обратную сторону

FLAW     = порядок, который находится на отметке времени, уничтожен

back-draw = есть запрос в вложенном цикле.

ВОПРОС: Можно ли все это сделать с помощью запроса? если да, то как?

Теги:

3 ответа

2
Лучший ответ

Используйте соединение:

select
  i.*
from
  favorites f
  join images i on f.img_id = i.img_id
where
  f.user_id = <user id>

Кроме того, измените свой код, чтобы использовать mysqli и подготовленные операторы с переменными связывания для повышения производительности и устранения угрозы SQL-инъекций.

  • 0
    В вашем запросе есть некоторые ошибки, и я бы предложил PDO поверх mysqli. Каждый основной PHP ORM построен на нем по уважительной причине.
  • 0
    в том, что точный синтаксис или есть что-то, что мне нужно поставить вместо i & f
Показать ещё 8 комментариев
0

Нет циклов, просто запросите обе таблицы.

SELECT 
    images.*
FROM
    images
INNER JOIN
    favorites
ON
    favorites.img_ID = images.img_ID
WHERE
    favorites.user_ID = X
0
SELECT i.*   -- possibly would need to be "SELECT DISTINCT i.*" instead
FROM images AS i
    INNER JOIN favorites AS f
        ON f.img_ID = i.img_ID
WHERE f.user_ID = ???
  • 0
    DISTINCT бесполезен, потому что в таблице избранного кортеж img_ID & user_ID служит моим первичным ключом

Ещё вопросы

Сообщество Overcoder
Наверх
Меню