2009-11-04 3 views
0

мне нужно разделить любой MySQL отборного заявление в его основных частях: SELECT, FROM, все стыков (если таковой имеется), WHERE (если она существует), GROUP BY (если она существует), HAVING (если она существует), ORDER BY (если она существует), LIMIT (если она существует) ...разделить отборное заявление с регулярным выражением

я попытался с помощью регулярных выражений, но я не очень хорошо с ними ... для выберите regex был прост (любой SELECT, который приходит в начале строки - ^SELECT), но после этого я споткнулся ... все, что я знаю, что «FROM» не должно содержаться в() - это будет означать, что это из подзадачи ... и я думаю, что все другие части select (JOINS, WHERE, GROUP BY и т. д.) будут соответствовать этому правилу ... , но я не знаю, как написать такое правило ... и я надеюсь, что кто-то может мне помочь ...

для оператора выбора:

SELECT SQL_CALC_FOUND_ROWS (SUM(TIME_TO_SEC(audioMelodii.durata))/60) AS durataTotal, (SELECT COUNT(audioMelodii.id) FROM audioMelodii) AS nrMelodii, audioArtisti.nume AS artist, audioAlbume.*
FROM audioAlbume
LEFT OUTER JOIN audioMelodiiAlbume ON (audioMelodiiAlbume.idAlbum=audioAlbume.id)
LEFT OUTER JOIN audioMelodii ON (audioMelodii.id=audioMelodiiAlbume.idMelodie)
LEFT OUTER JOIN audioArtisti ON (audioAlbume.idArtist=audioArtisti.id)
WHERE audioAlbume.idArtist='$idArtist'
GROUP BY audioAlbume.id
ORDER BY dataLansare DESC, id DESC
LIMIT 0,10

результат я ищу будет что-то вроде этого:

$STATEMENT['SELECT']='SELECT SQL_CALC_FOUND_ROWS (SUM(TIME_TO_SEC(audioMelodii.durata))/60) AS durataTotal, (SELECT COUNT(audioMelodii.id) FROM audioMelodii) AS nrMelodii, audioArtisti.nume AS artist, audioAlbume.*';
$STATEMENT['FROM']='FROM audioAlbume';
$STATEMENT['JOINS']='LEFT OUTER JOIN audioMelodiiAlbume ON (audioMelodiiAlbume.idAlbum=audioAlbume.id)
LEFT OUTER JOIN audioMelodii ON (audioMelodii.id=audioMelodiiAlbume.idMelodie)
LEFT OUTER JOIN audioArtisti ON (audioAlbume.idArtist=audioArtisti.id)';
$STATEMENT['WHERE']="WHERE audioAlbume.idArtist='$idArtist'";

и т.д ...

большое спасибо! все лучшее!

ответ

2

SQL не является языком, который может быть проанализирован с помощью регулярных выражений.
Вам действительно нужно использовать полноразмерный анализатор SQL для этой задачи.

Смотрите также:

2

Вы не можете сделать это легко с регулярными выражениями в силу рекуррентного сложности SQL (суб-запросов, суб-суб-запросы, которые могут возникнуть в нескольких местах.

Возможно, если вы объясните свою конечную цель, мы сможем помочь вам найти лучшее решение.

Смежные вопросы