У меня есть таблица с именем 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 = есть запрос в вложенном цикле.
ВОПРОС: Можно ли все это сделать с помощью запроса? если да, то как?
Используйте соединение:
select
i.*
from
favorites f
join images i on f.img_id = i.img_id
where
f.user_id = <user id>
Кроме того, измените свой код, чтобы использовать mysqli и подготовленные операторы с переменными связывания для повышения производительности и устранения угрозы SQL-инъекций.
Нет циклов, просто запросите обе таблицы.
SELECT
images.*
FROM
images
INNER JOIN
favorites
ON
favorites.img_ID = images.img_ID
WHERE
favorites.user_ID = X
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 = ???