MYSQL PDO - поиск по множеству в предложении - PullRequest
0 голосов
/ 01 мая 2018

Я не могу разобраться, как построить этот SQL-запрос.

У меня есть 3 таблицы.

Пользователи Таблица

  1. user_id
  2. имя
  3. фотография и т.д.

tag_ref таблица

  1. user_id
  2. tag_id

геолокация таблица

  1. user_id
  2. geolat
  3. Geolon

Что мне нужно сделать, так это найти пользователей по местоположению и с какими тегами они связались с ними. У меня оба запроса работают по отдельности.

Это то, что я использовал для запроса местоположения:

$sql_search_people = "SELECT user_id, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation 
        HAVING distance < '25'";

Затем мне нужно отфильтровать результаты по tag_id из таблицы tag_ref. Пользователи могут искать по нескольким тегам. Я сделал этот seperatley здесь:

$sql_search_people = "SELECT b.user_id, b.name, b.picture, b.tagline, b.genres FROM tag_ref AS a LEFT JOIN users AS b ON a.user_id = b.user_id WHERE a.tag_id IN ($in) GROUP BY a.user_id";

Теперь мне просто нужно выяснить, как объединить два вместе в один запрос. Что я не могу понять! Я пробовал соединения и подзапросы, но мне действительно трудно их понять.

Любая помощь будет принята с благодарностью.

** ОБНОВЛЕНИЕ **

Проиграв немного больше, мне удалось заставить это работать:

    $sql_search_people = "SELECT a.user_id, b.user_id, c.user_id, c.tag_id, b.name, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation AS a RIGHT JOIN tag_ref AS c ON a.user_id = c.user_id RIGHT JOIN users AS b ON a.user_id = b.user_id WHERE c.tag_id IN ($in) HAVING distance < '25' ";

Но, конечно, это дублирует результаты, когда у пользователя более одного тега. Когда я добавляю группу в группу по user_id, запрос не выполняется?

1 Ответ

0 голосов
/ 01 мая 2018

У меня есть мысль, используя первый запрос, это временная таблица для вызова второго запроса:

SELECT b.user_id, b.name, b.picture, b.tagline, b.genres FROM tag_ref AS a LEFT JOIN users AS b ON a.user_id = b.user_id,  (SELECT user_id, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation
HAVING distance < '25') as location WHERE a.tag_id IN ($in) GROUP BY a.user_id
...