Нужна помощь со скриптом (MySQL, Left JOIN)

VladimirZH

Новичок
Нужна помощь со скриптом (MySQL, Left JOIN)

Такая ситуация:

существует 3 таблицы

account (id, Login) - аккаунты
contacts (id1, id2, c1, c2) - контакты, где id1 - кто попросился, id2 - к кому попросились, c1, c2 - знаки принятия контактов один другим
photos (id, to_user) - фотографии

Нужно сделать запрос, который выбирал бы 10 последних фотографий, загруженных пользователями в контакт-листе. Ничего путевого сделать не получается, не сильно силен в left join и т.д.

Вот то, что попытался сделать, но что-то не работает:

$r = mysql_query("SELECT account.id, account.Login, photos.id AS ph FROM account, contacts, photos WHERE (((contacts.id1 = '$id') AND (account.id = contacts.id2)) OR ((contacts.id2 = '$id') AND (account.id = contacts.id1))) AND (contacts.c1 = 1) AND (contacts.c2 = 1) AND (photos.to_user = account.id) ORDER BY photos.id DESC limit 10") or die ("Query failed");
while ($l = mysql_fetch_assoc($r)) {
print_r($l);
}

(((contacts.id1 = '$id') AND (account.id = contacts.id2)) OR ((contacts.id2 = '$id') AND (account.id = contacts.id1))) - в этом скорее всего запутался, подразумевается, что как мы можем добавить кого-то в список контактов, так и нас могут.

Спасибо за помощь!
 

prolis

Новичок
запросы строят с простейших, к одной таблице, и постепенно наращивая и проверяя результаты в среде, типа phpmysqladmin.
попытайся построить запрос к таблице contacts, выбрав id(id2) всех подтвержденных контактёров $id
 

VladimirZH

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

prolis

Новичок
насчет слишком или не слишком много ты пока предположить не можешь
построй запросик-то
 

VladimirZH

Новичок
$r = mysql_query("SELECT account.id, account.Login FROM account, contacts WHERE (((contacts.id1 = '$id') AND (account.id = contacts.id2)) OR ((contacts.id2 = '$id') AND (account.id = contacts.id1))) AND (contacts.c1 = 1) AND (contacts.c2 = 1)") or die ("Query failed");
while ($l = mysql_fetch_assoc($r)) {
$r1 = mysql_query("SELECT photos.id FROM photos WHERE photos.to_user = '{$l["id"]}' limit 10") or die ("Query failed");
while ($l1 = mysql_fetch_assoc($r1)) {
print_r($l1);
}
}

Так вот получается. Если у пользователя много друзей, то это уже вложенный запрос, и количество запросов, хоть и простых, будет исчисляться сотнями. Это плохо. К тому же здесь скрипт выводит 10 фотографий от каждого конкретного пользователя, а нужно 10 последних ото всех.
 

prolis

Новичок
VladimirZH
данный запрос возвращает правильный результат?
если да, то смело добавляй photos как в первоначальном посте. В чем тогда проблема-то?
 

VladimirZH

Новичок
Запрос виснет и блокирует таблицу. А второй запрос возвращает неправильный результат. Вместо желаемых 10 фотографий всех контактов, он возвращает 10 последних фотографий каждого контакта.
 
Сверху