Я хочу выбрать данные из одной таблицы, которая соответствует определенным условиям, а затем выбрать данные из другой таблицы на основе условий данных, которые я только что выбрал, и иметь возможность просматривать выборки из обеих таблиц. Я попытался это с помощью вложенного выбора:
$query =
"SELECT
`url`, `userID`, `likes`, `time`, `latitude`, `longitude`, `distance `,
(SELECT `up` from userHistory WHERE userHistory.url = photoList.url AND userHistory.userID = photoList.userID)
FROM
photoList
WHERE
`valid` = '1' AND `time` > '$validTime' AND `likes` > '-6'
HAVING
`distance` < '1'
ORDER BY
`time` DESC
LIMIT
'0' , '200'";
По сути, я хочу выделить объект в photoList … и затем сделать выбор в userHistory, соответствующий URL и userID в выбранной строке photoList. Я хочу выбрать оба из них, чтобы при циклическом переходе в PHP я мог сделать следующее:
while ($row = $result->fetch_assoc()){
$storeObjects[] = array("url" => $row["url"], "userID" => $row["userID"],
"latitude" => $row["latitude"], "longitude" => $row["longitude"],
"likes" => $row["likes"],
"time" => $row["time"], "distance" => $row["distance"],
"userLiked" => $row["up"]); //$row["up"] is ALWAYS NULL
}
В приведенном выше цикле $ row [«up»] всегда равно NULL, а остальные категории в строке — это ожидаемые значения. Мне интересно, является ли $ row [«up»] даже правильным способом доступа к данным, выбранным подзапросом.
Вы можете JOIN
2 таблицы, как показано ниже:
SELECT p.`url`, p.`userID`, p.`likes`, p.`time`, p.`latitude`,
p.`longitude`, p.`distance`, u.`up`
FROM photoList p
JOIN userHistory u
ON u.`url` = p.`url`
AND u.`userID` = p.`userID`
WHERE p.`valid` = '1'
AND p.`time` > '$validTime'
AND p.`likes` > '-6'
HAVING p.`distance` < '1'
ORDER BY p.`time` DESC
LIMIT 0, 200
Ты можешь использовать NATURAL JOIN
объединить две таблицы с общими атрибутами, например так:
SELECT url, userID, likes, time, latitude, longitude, distance, up
FROM photoList
NATURAL JOIN userHistory
WHERE valid = 1 AND time > '$validTime' AND likes > -6 AND distance < 1
ORDER BY time DESC
LIMIT 0, 200