Autor Zpráva
Tomashek
Profil
Zdravím, v regulárních výrazech nejsem žádný odborník a tak se ptám, jak by šlo udělat, aby nahradil jakýkoliv text (.*) do urciteho slova?
Příklad:
SELECT (.*) FROM

Myslel jsem, že to funguje dobře.. problém je ale v tom, že pokud mám v tom query více FROM (spojování tabulek), vybere to veškerý text až po ten druhý FROM a tudíž mně to vyhodí chybu, protože je nesmyslný SELECT.
Snad jsem to popsal dobře, děkuji za rady.
mckay
Profil
Tomashek:
Myslím, že dvakrát FROM by v SQL nemělo být použito bez závorky (použiješ UNION()). Potom by to mělo fungovat jako v matematice, to co použiješ na jedno FROM se ti použije jen v té závorce, kde to FROM máš :).
AM
Profil *
Řešení je líný kvantifikátor (.*? lokálně nebo mofifikátor /U (ungreedy) globálně pro všechny kvantifikátory ve výrazu). Ale mckay má pravdu, při spojování tabulek se nepoužívá více FROM ale JOINy :)
Tomashek
Profil
Jasně je to v Joinu, ale i tak mně to hodí až k němu:
SELECT
 něco
FROM 
  tabulka
LEFT JOIN
  (SELECT něco FROM tabulka2) as LJoin
  ......
  
AM_
Profil
a proč ne
SELECT
  něco
FROM
  tabulka
LEFT JOIN
  tabulka2
....

?
Tomashek
Profil
Protože to je komplikovanější.
Hodím sem celý SELECT .. a řeším to kvůli toho, že jsem si vytvořil třídu na stránkování, a když mám v tom selectu 2x FROM, tak (.*) vybere všechno až po ten druhý, takže mně to vyhodí SQL chybu.

SELECT
  gs_raids.id,
  gs_raids.datetime,
  gs_raids.name,
  gs_raids.organizer AS organizerId,
  gs_raids.level,
  gs_raids.people,
  gs_users.game_nick AS organizerNick,
  COALESCE(logged,0) AS logged
FROM 
  gs_raids
LEFT JOIN
  gs_users
 ON
  gs_users.id = gs_raids.organizer
LEFT JOIN
  (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs
ON
  gLogs.raid=gs_raids.id 
WHERE
  gs_raids.guild = '".$gs['guild']."'"
Majkl578
Profil
AM:
při spojování tabulek se nepoužívá více FROM ale JOINy
Používá se také v subselectech.

[#6] Tomashek
Použij třeba (.*?) jak radil AM_.

Nebo:
$sql = 'SELECT
  gs_raids.id,
  gs_raids.datetime,
  gs_raids.name,
  gs_raids.organizer AS organizerId,
  gs_raids.level,
  gs_raids.people,
  gs_users.game_nick AS organizerNick,
  COALESCE(logged,0) AS logged
FROM 
  gs_raids
LEFT JOIN
  gs_users
 ON
  gs_users.id = gs_raids.organizer
LEFT JOIN
  (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs
ON
  gLogs.raid=gs_raids.id 
WHERE ...';
$sql = preg_replace('~SELECT\s+.+\s+FROM~Uis', 'SELECT * FROM', $sql);
echo $sql;
Tomashek
Profil
Zkoušel jsem obě varianty. Jak
(.*?)
, tak
'~SELECT\s+.+\s+FROM~Uis'
.
Už to vybere od SELECTU po FROM, ale problém zůstává, že to vybere oba dva.
SELECT tady něco FROM 
  gs_raids 
 LEFT JOIN gs_users ON gs_users.id = gs_raids.organizer 
 LEFT JOIN (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs 
...pokračování selectu...
tiso
Profil
Tomashek: tak ten regulár uprav aby nebral select... pokiaľ je pred ním zátvorka.
Tomashek
Profil
Hurá, po hodinách zkoušení reguláru jsem na to (asi) přišel. Výběr začíná SELECTEM čili
^SELECT.*?FROM
je tedy ten regulár, který vybere SELECT cokoliv po první FROM. Děkuji za Vaše rady. Snad to poběží jak jsem si představoval.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0