За последние 24 часа нас посетил 18391 программист и 1613 роботов. Сейчас ищут 1313 программистов ...

Как объединить два поля из разных таблиц в одно?

Тема в разделе "MySQL", создана пользователем karakh, 9 фев 2009.

  1. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Задачка примерно такая:

    есть таблицы - билеты, вокзалы, города.
    В таблице "вокзалы" есть коды вокзалов (уник) и коды городов в котором этот вокзал находится.
    в таблице "города" есть собственно коды городов.
    в таблице "билеты" есть поле "куда едем". Там должен быть код города.
    Но дикие юзеры время от времени пишут туда код вокзала.
    Запрещать уже поздно. Там сейчас около 40 тысяч неправильных записей.

    Требуется при чтении из таблицы "билеты" откуда-то выковыривать всегда только код города и по нему сортировать.

    И все это одним запросом - записей много, проект высоконагружен.

    Как?
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    юзер не должен писать куда-то код города - у него должен быть список. Это не юзер дикий, а разработчик с дерева не слез.
    однократно переделай по людски.

    распиши как ты распознаешь что это вокзал, а не город.
     
  3. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    1. Несколько тысяч городов я выдавать списком отказываюсь.
    2. Условия задачи неизменны. Менять уже поздно. Я не могу поменять 40 тысяч неправильных записей, часть из которых уже в архивах.
    3. никак. Единственный способ - если кода нет в таблице городов, значит он вокзал. В принципе, если он еще и не вокзал, значит надо вернуть некую константу, но если я разберусь с вышеописанной задачей, то это я и сам сделаю.

    Происходит это так: юзер (типа кассир) принимает заказ по телефону
    Система вычисляет маршрут на 5 пересадок. В сторонней системе кассир заказывает билеты. И копипастит коды городов в специальную форму. Но иногда он копипастит не то поле - не город а вокзал. В большинстве городов больше одного вокзала. Объяснить енд юзеру что это важно - нереально. Их тоже несколько тысяч.
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    у меня был аякс, который выдавал список городов/улиц по первым трем буквам. или посмотри как это сделано на tutu.ru и других аналогах.
    можно сделать выдавать список по коду города.
    иначе с таким подходом тебе не стоит браться вообще за любую базу. это важнее, чем текущий момент с поиском городов. (сам запрос элементарен - left join ... ifnull... и т.п.)
     
  5. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Это вообще не вариант. Я знаю несколько способов это сделать, когда я говорил о том что не хочу выдавать многотысячный список, меня не его длина волновала, а то что это запрос, возвращающий несколько тысяч записей. А с аяксом это несколько запросов. Все - запрет. Невозможно даже при вводе кода города проверять есть ли такой в базе, потому что лишний запрос на нагруженном участке. Вариант "докупить серверов" не в моей компетенции.

    Репорт для которого это нужно отсматривается раз в неделю, если потормозит - не беда. А ввод этой инфы в базу - скажем, раз в минуту. А вообще обращения к базе - постоянно. Не надо делать раз в минуту лишний запрос для выдачи списка.

    И кроме того - в базе уже много неправильных записей. И неизвестно что к ним уже привязано. Поэтому вопрос "как именно все нафиг переделать" вообще не стоит. И стоит ли мне браться за базу - тоже.

    Есть высоконагруженный проект. Его писал не я - это пока не мой уровень, если честно. Есть небольшая задача - исправить репорт. О проблеме известно, пути ее устраенения если и рассматриваются, то не мной. Но репорт должен работать с теми данными которые есть. Так что важнее сейчас именно текущий момент с поиском городов.

    Так что вот этот элементарный запрос мне и нужен. Это должно быть примерно как
    [sql]select (cty1 or cty2), еще_поля from tickets;
    где
    cty1 = where_to from ticket -- если запись правильна и это код города
    cty2 = city_code from terminal where terminal_code = ticket.where_to -- если запись неправильна и это код вокзала
    [/sql]
    И вот как это нормально записать я не знаю. Причем чувствую что просто туплю и это очень просто.
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    это запрос, возвращающий десяток-другой записей. ты уверен что на уровне ниже третьего класса школы стоит заниматься такими проектами?

    Что занимаешься этим не ты - я понал.

    боюсь, те кто писал еще хуже...

    по запросу:
    http://ict.edu.ru/ft/001779/index.shtml
    что именно смотреть - я дал подсказку.
     
  7. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Это либо один запрос возвращающих несколько тысяч + обработка массива, либо ajax + несколько запросов с уменьшающимся количеством записей + ничего не работает при отключенном js. И в любом случае - это лишний запрос на нагруженном участке.

    Спасибо за высокую оценку. Это мое 378 сообщение на форуме, на котором я задал всего два вопроса, включая этот. Мне было очень интересно узнать, каким образом вы составляете мнение о собеседниках.

    Огромное спасибо за ссылку на мануал по SQL. Я впервые вижу мануал по SQL. Я вообще впервые вижу мануал. Я вообще никогда ничего не видел. Я прозрел! Аллиелуйя!

    Вопрос снят, тему можно закрывать.
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    заявления, что копипастить ид юзером и вообще отдавать юзеру ввод нормально, достаточно, чтобы составить мнение о собеседнике, увы. Волосы дыбом стоят.
    комментарии мне в аську по ветке:
    рассуждения о загруженных участках при таком вводе юзером ничего, кроме печали, не вызывают.



    это я кому писал? или это ветка "мне лениво писать ваще, напишите за меня все запятые"?
     
  9. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Это не нормально. Это сделано и исправлению не подлежит.

    Программа доктор проста как самокат, состоит из пары строчек и уже готова, но есть проблема. Несколько сотен свежепроданных билетов превратятся мгновенно превратятся в тыкву. Менять данные в базе пока запрещено. А исправленный репорт нужен сейчас.
    Изменение интерфейса ввода не обсуждается. Это просто вне контекста вопроса. В любом случае оно встанет в строй через пару недель глобального тестирования. А исправленный репорт нужен сейчас.
    Любой лишний запрос при вводе - жестко запрещен. Я рад за ваших знакомых в аське и очень им завидую. Они всегда работали только на себя и не сталкивались с ситуацией, когда по различным причинам запрещено что-то менять, даже если несложно и очень хочется. А исправленный репорт нужен сейчас.

    Вкратце задача звучит как "В базе некорректные данные. Нужен корректный репорт. Данные в базе менять нельзя". Все остальное - лирика и в разговоры в пользу бедных. Зря я повелся и начал объяснять почему именно данные некорректны.

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

    P.S. За IFNULL спасибо. Это именно то что я лихорадочно пытался вспомнить. Как я уже говорил, вопроса больше нет.
     
  10. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    печалит именно эта психология.
    Вводят как раз нормальные люди.
    обезьяны это писали. Которых надо в клетке показывать.
     
  11. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Это тоже не имеет значения.