Выберите имена столбцов на основе записи пользователя с помощью запроса MYSQL - PullRequest
0 голосов
/ 18 октября 2019

Используя PHP, защищенный пользователь вводит ссылку (например, NB093019), запрос будет использоваться для определения того, какие PO имеют этот Ref и есть ли у них какое-либо количество. Проблема состоит в том, что у нас есть 86 столбцов, чтобы проверить, есть ли этот Ref, и затем, когда он находит, в каком столбце находится, как проверить соответствующий столбец, содержащий это количество (таблица не может быть отредактирована).

Iможет заставить это работать с 86 операторами if в PHP, а затем с другими операторами if внутри каждого оператора PHP. У меня нет точки запуска, когда я делаю начальный запрос.

select 'remainder'as prefix, po,  *comments,*GuideRef, *Qty
from remainder 
where  ('NB092419')IN (NWANTcomments,NWANTGuideRef,NWANTpreviouscomments,
                        NWANTpreviousGuideRef,NWANTprevious2comments,
                        NWANTprevious2GuideRef, BPrev2GuideRef, 
                        BPrev2comments, BPrevGuideRef, BPrevcomments, 
                        aGuideRef, Mcomments,MGuideRef,acomments,
                        MAGuideRef,BOGuideRef ) 
group by po

Я удалил некоторую информацию in (), так что это не так долго, так что будут решены * комментарии, * GuideRef, * Qtyпо которому один из столбцов в операторе IN () возвращает информацию. Возможно ли это даже

1 Ответ

0 голосов
/ 18 октября 2019

Возможно, вы могли бы написать SQL, который записывает SQL:

 select REPLACE(
   'SELECT ''{colstub}GuideRef'' as which, {colstub}Qty FROM remainder WHERE {colstub}Ref like ''%somevalue%'' UNION ALL',
   '{colstub}',
   REPLACE(column_name, 'GuideRef', '')
 )  
 FROM information_schema.columns 
 WHERE table_name = 'remainder' and column_name LIKE '%Ref'

Это работает как «вытянуть все имена столбцов из информационной схемы, где имя столбца похоже на% guideref, замените guideref ничем»чтобы получить только измененный фрагмент имени столбца: NWANTguideref -> NWANT, NWANTpreviousguideref -> NWANTprevious ... затем использует эту заглушку для формирования запроса, который дает строку, отображающую имя столбца, кол-во из столбца количества, где соответствующий столбец guideref НРАВИТСЯ какое-то значение "

Если вы запустите это, он выдаст результирующий набор, например:

SELECT 'aGuideRef' as which, aQty FROM table WHERE aGuideRef LIKE '%lookingfor%' UNION ALL 
SELECT 'bGuideRef' as which, bQty FROM table WHERE bGuideRef LIKE '%lookingfor% ...

Таким образом, он в основном выдает загрузку строк, которые сами по себе являются SQL. Может потребоваться небольшая тонкая настройка, и, надеюсь, все ваши столбцы надежно и жестко похожи на xQty, xGuideRef, xComments триплеты, но по сути это большинство запросов для вас:

Если вы затем скопируете набор результатов из результатовСетка и вставьте его обратно в окно запроса, удалите последний UNION ALL и запустите его, он будет искать столбцы и сообщит вам, где он был найден, а также количество

Это не слишком удобно для производственной системы, но вы можете сделать то же самое в php-запросе, получить строки в другой команде sql, перезапустить ее ..

Я бы посоветовал вам рассмотреть вопрос об изменении структуры таблицы:

prefix, qty, guideref, comments

У вас не должно быть 86 столбцов, которые в основном совпадают;у вас должен быть один столбец с одним из 86/3 различных значений, тогда вы можете просто запросить guideref и тип. Если бы это была таблица адресов, я говорю, что у вас ** не должно быть * HomeZipcode, WorkZipcode, UniversityZipcode, MomZipcode, DadZipcode ... и каждый раз, когда вы хотите сохранить другой тип адреса, вы добавляете больше столбцов (BoyfriendZipcode, GirlfriendZipcode,Child1Zipcode ...). Вместо этого, если у вас только что был столбец «addresstype», вы можете хранить любое количество различных типов адресов без перекомпиляции приложения и изменения схемы БД.

. Вы можете использовать эту технику, чтобы изменить форму таблицы - напишитеSQL, который записывает связку UNION ALL sqls (без предложений WHERE), один из столбцов должен быть столбцом «recordtype» (из colstub), а остальные столбцы должны быть просто «qty», «guide», «comments». После того, как вы установили свой результат с профсоюзами, вы можете составить таблицу для этих 4 вещей, а затем поставить INSERT INTO newtable во главе блока профсоюзов

...