#php #mysql #union
#php #mysql #объединение
Вопрос:
У меня есть таблица, в которой хранятся 5 разных координат сетки, которые мне нужно перечислить по кратчайшему расстоянию от заданной координаты. Поэтому я подумал, что буду использовать объединение и запрашивать таблицу 5 раз, каждый раз используя псевдоним для другого столбца. но, похоже, каждый псевдоним возвращает значение первого выбора. вот запрос, который я пробовал.
SELECT floor(sqrt(pow((cord_1x-$cord1x),2) pow((cord_1y-$cord1y),2))) as distance,
alliance_name, player_name, level, priority,cord_1x AS cordx, cord_1y AS cordy,
cord_2x, cord_2y, cord_3x, cord_3y, cord_4x, cord_4y, cord_5x, cord_5y
FROM cords
where alliance_id = " .$myalliance_id. " AND cord_1x <> '' AND active ='1'
UNION
SELECT floor(sqrt(pow((cord_2x-$cord1x),2) pow((cord_2y-$cord1y),2))) as distance,
alliance_name, player_name, level, priority,cord_1x, cord_1y,
cord_2x AS cordx, cord_2y AS cordy, cord_3x, cord_3y, cord_4x, cord_4y, cord_5x, cord_5y
FROM cords
where alliance_id = " .$myalliance_id. " AND cord_2x <> '' and active ='1'
order by distance ASC";
результат, который я пытаюсь получить,
имя игрока_имя альянса имя_уровня приоритет расстояние шнур
джон плохие парни 10 высокий 4 1,1
джон плохие парни 10 высокий 6 2,2
что я получаю
имя игрока_имя альянса имя_уровня приоритет расстояние шнур
Джон плохие парни 10 высокий 4 1,1
джон плохие парни 10 высокий 6 1,1
похоже, что я использую псевдоним неправильно. он не будет применять значение для следующего столбца к тому же имени псевдонима, которое используется при первом выборе.
имейте в виду, что я использовал только 2 выборки для целей тестирования, это проще, но когда я пойму это, я буду запрашивать таблицу 5 раз
Комментарии:
1. проблема, с которой я сталкиваюсь, заключается в том, что мне нужен cord_1x как cordx для первого выбора, но мне нужен cord_2x как cordx при втором выборе. но второй select, похоже, возвращает cordx со значением, которое было задано в первом select . хотя псевдоним distance работает правильно
Ответ №1:
Сначала используйте UNION ALL
. Вы не хотите UNION
принимать решение о слиянии двух строк результирующего набора, потому что они одинаковые.
Во-вторых, для двух подзапросов в вашей UNION ALL
операции вы должны сопоставить столбцы по имени, типу данных и позиции. Вы пытаетесь привести их в соответствие только по имени и типу данных.
То есть вам нужно что-то вроде этого:
SELECT floor(sqrt(pow((cord_1x-$cord1x),2) pow((cord_1y-$cord1y),2))) as distance,
alliance_name, player_name, level, priority,
cord_1x AS cordx, cord_1y AS cordy, /*alias columns */
cord_1x, cord_1y, cord_2x, cord_2y, /* cord_1 columns repeat */
cord_3x, cord_3y, cord_4x, cord_4y, cord_5x, cord_5y
FROM cords
where alliance_id = " .$myalliance_id. " AND cord_1x <> '' AND active ='1'
UNION ALL
SELECT floor(sqrt(pow((cord_2x-$cord1x),2) pow((cord_2y-$cord1y),2))) as distance,
alliance_name, player_name, level, priority,
cord_2x AS cordx, cord_2y AS cordy, /* different alias columns */
cord_1x, cord_1y, cord_2x, cord_2y, /* cord_2 columns repeat */
cord_3x, cord_3y, cord_4x, cord_4y, cord_5x, cord_5y
FROM cords
where alliance_id = " .$myalliance_id. " AND cord_2x <> '' and active ='1'
order by distance ASC";