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
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");
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;