MySQLWorkbench: как прилагать нумерации Списков, которые повторно перечисляются, изменив стоимость поля Со стоимостью поля другой Таблицы?

Хорошие, мой вопрос немного сложный. У меня есть следующий код (очень благодарный McNets из-за помощи с формулой).:

select 
       @cid := case when @poblacion = poblacion then @cid + 1 else @cid := 1 end as cid,
       @poblacion := poblacion as p,
       nombre
from
    (select @cid := 1) i,
    (select @poblacion := poblacion as poblacion, nombre from Clientes order by poblacion) t

Что возвращает их мне следующий:

+-----+-------------+--------+
| cid |  poblacion  | nombre |
+-----+-------------+--------+
|  1  | Los Angeles |  John  |
+-----+-------------+--------+
|  2  | Los Angeles |  Pepe  |
+-----+-------------+--------+
|  3  | Los Angeles | Serena |
+-----+-------------+--------+
|  1  |  San Diego  |  Lola  |
+-----+-------------+--------+
|  2  |  San Diego  |  Juan  |
+-----+-------------+--------+
|  3  |  San Diego  |  Maria |
+-----+-------------+--------+

И в другой таблице так называемая Дорожка у меня есть следующая стоимость:

+-----+-------------+---------+
|  ID |   Ciudad    |Iniciales|
+-----+-------------+---------+
|  1  | Los Angeles |    LA   |
+-----+-------------+---------+
|  2  |  San Diego  |    SD   |
+-----+-------------+---------+
|  3  |  New York   |    NY   |
+-----+-------------+---------+

Искала прилагать инициалы таблицы Дорожка с теми таблицы Клиенты.

Оставаясь более или менее таким:

+------------+-------------+---------+
|    Cod     |   Ciudad    |  Nombre |
+------------+-------------+---------+
|  LA000001  | Los Angeles |  John   |
+-----+------+-------------+---------+
|  LA000002  | Los Angeles |  Pepe   |
+------------+-------------+---------+
|  LA000003  | Los Angeles | Serena  |
+------------+-------------+---------+
|  NY000001  |  New York   |  Lola   |
+------------+-------------+---------+
|  NY000002  |  New York   |  Juan   |
+------------+-------------+---------+
|  SD000001  |  San Diego  |  Maria  |
+------------+-------------+---------+

Сделав inner joins формулу оно не функционирует, с case when, if, и миллион параметров я остаюсь так, что Дорожка может не объединить указанную формулу более наверху со связыванием инициалов Таблицы, нули, которые будут исчезать так же как @cid, увеличьтесь, спасибо заранее!

3
задан 13.01.2017, 20:29
0 ответов

Мы добавляем таблицу Дорожки с одним LEFT JOIN на всякий случай имена не совпадают, с LPAD мы помещаем ему 0 перед храбрым вождем, и используем CONCAT чтобы соединять инициалы со стоимостью.

select concat(iniciales, lpad(cid, 6, 0)) as Cod, p as Ciudad, nombre
from
    (select 
           @cid := case when @poblacion = poblacion then @cid + 1 else @cid := 1 end as cid,
           @poblacion := poblacion as p,
           t.nombre,
           t.iniciales
    from
        (select @cid := 1) i,
        (select @poblacion := tt.poblacion as poblacion, tt.nombre, loc.iniciales 
         from tt
             left join loc on tt.poblacion = loc.poblacion 
         order by tt.poblacion) t
     ) t1

+----------+-------------+--------+
|    Cod   | Ciudad      | nombre |
+----------+-------------+--------+
| LA000001 | Los Angeles | John   |
+----------+-------------+--------+
| LA000002 | Los Angeles | Pepe   |
+----------+-------------+--------+
| LA000003 | Los Angeles | Serena |
+----------+-------------+--------+
| SD000001 | San Diego   | Lola   |
+----------+-------------+--------+
| SD000002 | San Diego   | Juan   |
+----------+-------------+--------+
| SD000003 | San Diego   | Maria  |
+----------+-------------+--------+

Здесь ты можешь проверять это: http://rextester.com/JSZSN59277

2
ответ дан 03.12.2019, 17:41
  • 1
    Excelsior!, спасибо McNets снова ты это сделал... уже probé возможной; rextester и funcionó в perfecció n... я это буду скроллировать в моем bbdd прямо сейчас, снова большое спасибо! –  13.01.2017, 23:42

Нужно быть осторожно с консультациями, которые используют технику переменных, прежде всего, когда они начинают быть сложнее.

В действительности, MySQL не предлагает много гарантий относительно порядка, в котором он обрабатывает переменные. И в случае ответа @McNets, хотя он очень интересен, он может вызывать у тебя проблемы без объявления. Особенно, потому что консультация принимает много вещей:

  • Пойми, что join будет обрабатывать реестры в порядке especifiado внутри суб-консультации (ORDER BY poblacion)
  • Пойми, что результат join будет выходить в том же порядке especifiado внутри суб-консультации (ORDER BY poblacion)
  • Прими, что переменные в SELECT они обработаны в письменном порядке.

Но в действительности, эти вещи не гарантированы, так что консультация остается очень хрупкой. Заметь то, что говорит документацию MySQL по этому поводу:

Схвати в генерала задницу, other than in SET statements, you should never assign в value to в user переменная and read the оцените within the same statement.

For other statements, such эксперт SELECT, you might get the results you expect, but this is not guaranteed.

However, the order of evaluation for expressions involving user переменные is undefined.

Мой перевод:

Как правило, если только он не будет внутри решения SET, никогда ты не был бы должен распределять ему стоимость в переменную и читать саму внутри того же решения.

Для других решений, как SELECT, возможно, что ты получаешь ожидаемые результаты, но это не гарантировано.

Тем не менее, порядок оценки выражений, которые содержат переменные, не определен.

Очевидно, идеальное состояло в том, чтобы мочь использовать функции окно как ROW_NUMBER(), но у MySQL нет их :(

Я предлагаю тебе следующую консультацию, которая, хотя он не предлагает лучший результат, по крайней мере, гарантирует тебе стабильные результаты. Ощутись, что для того, чтобы оно функционировало правильно, нуждаются в том, что таблица clientes включите какую-то числовую колонну, которая служила бы первичным ключом (в этой случай, я поместил ему одну, которая называется id). Если у тебя нет ее, стой добавлять одну, так как это не хорошая практика, что у твоей таблицы не было первичного ключа в любом случае:

select concat(l.iniciales, 
              lpad((select count(*) + 1
                     from clientes c2
                    where c2.poblacion = c.poblacion
                      and c2.id > c.id),
                   6, '0')) as cid,
       l.ciudad,
       c.nombre
  from clientes c
  join localizacion l
    on l.ciudad = c.poblacion
 order by cid;

Результат:

|    Cod     |   Ciudad    |  Nombre |
---------------------------------------
|  LA000001  | Los Angeles |  Serena |
|  LA000002  | Los Angeles |  Pepe   |
|  LA000003  | Los Angeles |  John   |
|  NY000001  |  New York   |  Juan   |
|  NY000002  |  New York   |  Lola   |
|  SD000001  |  San Diego  |  Maria  |

Demo


Заметь отдельно: он был бы рекомендуемым не повторять стоимость ciudad в обоих подмостках. Скорее, он был бы лучше, если таблица clientes включи скорее колонну localizacion_id или нечто похожее, определенная как foreign key к localizacion.id.

2
ответ дан 03.12.2019, 17:41
  • 1
    sstan, если таблица у клиента есть его собственный индекс, но таблица так называемый сетевой дневник - та, которая tendrá который выдавать в каждого клиента из-за города (podrí чтобы делать таблицу подробно опишите сетевой дневник, но они má s 7000 клиентов), asu раз каждый клиент из-за города и этой из-за состояния, и из-за страны, и así последовательно, каждый клиент имеет má s детали, он не приспосабливается к bbdd, tendré в счете тема garantí в консультаций, делая тесты результата указанной формулы, большое спасибо sstan! –  13.01.2017, 23:47
  • 2
    Я это понимаю 100 %. Это limitació n с использованием MySQL. –  13.01.2017, 23:50