Avatar billede folle Nybegynder
29. oktober 2005 - 23:20 Der er 8 kommentarer

UNION i mysql ver 3.23.55

Jeg har en tabel for et forum som består af felterne id,date,text og parent. Hvis en post er et svar til en anden post vil parent indeholde dennes id. Jeg vil gerne sortere posterne efter dato for seneste svar. Her er mit forslag til en sql query:

(SELECT parent.id, max( child.date ) AS date
FROM forum AS parent
LEFT  JOIN forum AS child ON parent.id = child.parent
WHERE child.date <>  'null'
GROUP BY parent.id )
UNION (
SELECT id, date
FROM forum
WHERE parent = 0)

Problemet er bare at mit webhotel kører mysql ver. 3.23.55 hvor det ikke er muligt at lave UNION mellem to SELECT queries. Er der en metode til at få samme resultat uden UNION?

Christian
Avatar billede arne_v Ekspert
29. oktober 2005 - 23:23 #1
nej

lad din app lave 2 queries og vise resultatet lige under hinanden så det ser ud
som en union
Avatar billede erikjacobsen Ekspert
29. oktober 2005 - 23:24 #2
Du kan 2 selects og i dit bagvedliggende sprog gøre noget med dem samlet.
Eller skifte wenhotel ;)
Avatar billede folle Nybegynder
29. oktober 2005 - 23:32 #3
Jeg bruger php. Hvordan samler jeg de to queries og sorterer dem efter dato?
Avatar billede erikjacobsen Ekspert
29. oktober 2005 - 23:34 #4
Put rækkerne fra begge forespørgsler i et og samme array, og brug http://php.net/usort på en kreativ måde ;)
Avatar billede folle Nybegynder
30. oktober 2005 - 01:05 #5
Det krævede lidt mere end jeg havde regnet med, men nu virker det. Tak for hjælpen. Kan I ikke lige lave et svar hvis i vil have point.

$merge = array();

$sql = "SELECT parent.id,parent.user_index,parent.header,DATE_FORMAT(max(child.date),'%e/%c-%y %T') AS date,";
$sql .= "parent.message,parent.parent FROM forum AS parent";
$sql .= " LEFT JOIN forum AS child ON parent.id = child.parent WHERE child.date <> 'null'";
$sql .= " GROUP BY parent.id";

$result = mysql_query($sql) or die(mysql_error());
while (false != ($row = mysql_fetch_assoc($result))) $merge = array_merge($merge,array($row));

$sql = "SELECT parent.id,parent.user_index,parent.header,DATE_FORMAT(parent.date,'%e/%c-%y %T') AS date,";
$sql .= "parent.message,parent.parent FROM forum AS parent";
$sql .= " LEFT JOIN forum AS child ON parent.id = child.parent WHERE isnull(child.id)";

$result = mysql_query($sql) or die(mysql_error());
while (false != ($row = mysql_fetch_assoc($result))) $merge = array_merge($merge,array($row));

function cmp($a_a, $a_b)
{
  $a = $a_a[date];
  $b = $a_b[date];
  $t_a = mktime(substr($a,9,11),substr($a,12,14),substr($a,15,17),substr($a,3,5),substr($a,0,2),"20".substr($a,6,8));
  $t_b = mktime(substr($b,9,11),substr($b,12,14),substr($b,15,17),substr($b,3,5),substr($b,0,2),"20".substr($b,6,8));
  if ($t_a == $t_b) return 0;
  else return ($a < $b) ? 1 : -1;
}

usort($merge,"cmp");
Avatar billede erikjacobsen Ekspert
30. oktober 2005 - 07:31 #6
while (false != ($row = mysql_fetch_assoc($result))) $merge = array_merge($merge,array($row));

kan laves som

while (false != ($row = mysql_fetch_assoc($result))) $merge[] =$row;

Hvordan opbevares din dato? Det er vel et dato-felt? Så kan din sammenligning nemlig være lidt nemmere.
Avatar billede folle Nybegynder
30. oktober 2005 - 10:52 #7
Min dato er i et dato-felt. Grunden til at jeg ændrer formatet er at det format skal bruges senere. Er der en nem måde at konvertere fra mysql dato-format til php dato-format?
Avatar billede erikjacobsen Ekspert
30. oktober 2005 - 16:49 #8
Ok, ja, du laver en date_format. Hvad med at tage det ud med din date_format og i råt format også? Så bliver din cmp-funktion simplere.

Og så er den forkert som den står. Hvis du vil have den med alle de udregninger skal du øndre

  if ($t_a == $t_b) return 0;
  else return ($a < $b) ? 1 : -1;

til

  if ($t_a == $t_b) return 0;
  else return ($t_a < $t_b) ? 1 : -1;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester