mysql php запрашивает одну и ту же таблицу 5 раз, используя один и тот же псевдоним, но каждый раз использует этот псевдоним для другого столбца

#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";