]> git.mxchange.org Git - friendica.git/commitdiff
MySQL ANY_VALUE with fallback to MIN
authorAlexandre Alapetite <alexandre@alapetite.fr>
Fri, 14 Apr 2017 22:42:44 +0000 (00:42 +0200)
committerAlexandre Alapetite <alexandre@alapetite.fr>
Fri, 14 Apr 2017 22:42:44 +0000 (00:42 +0200)
https://github.com/friendica/friendica/issues/3322

include/api.php
include/dba.php
include/notifier.php
include/photos.php
mod/message.php
mod/photos.php
mod/videos.php

index 477eb94b4e55de8026fa805266d2e802dfd64f6d..75f8ab069a83b1d4f8286d0183f1017d533c3ee2 100644 (file)
@@ -3099,13 +3099,14 @@ use \Friendica\Core\Config;
 
                $scale = (x($_REQUEST, 'scale') ? intval($_REQUEST['scale']) : false);
                $scale_sql = ($scale === false ? "" : sprintf("and scale=%d",intval($scale)));
-               $data_sql = ($scale === false ? "" : "data, ");
-
-               $r = q("select %s `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
-                                       `type`, `height`, `width`, `datasize`, `profile`, min(`scale`) as minscale, max(`scale`) as maxscale
-                               from photo where `uid` = %d and `resource-id` = '%s' %s
-                               group by `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
-                                       `type`, `height`, `width`, `datasize`, `profile`",
+               $data_sql = ($scale === false ? "" : "ANY_VALUE(data) AS data,");
+
+               $r = q("select %s ANY_VALUE(`resource-id`) AS `resource-id`, ANY_VALUE(`created`) AS `created`,
+                               ANY_VALUE(`edited`) AS `edited`, ANY_VALUE(`title`) AS `title`, ANY_VALUE(`desc`) AS `desc`,
+                               ANY_VALUE(`album`) AS `album`, ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`type`) AS `type`,
+                               ANY_VALUE(`height`) AS `height`, ANY_VALUE(`width`) AS `width`, ANY_VALUE(`datasize`) AS `datasize`,
+                               ANY_VALUE(`profile`) AS `profile`, min(`scale`) as minscale, max(`scale`) as maxscale
+                               from photo where `uid` = %d and `resource-id` = '%s' %s",
                        $data_sql,
                        intval(local_user()),
                        dbesc($_REQUEST['photo_id']),
index 62728acaed0294ba467cb126cd5ed022f1329e95..96df072cfa0b0921943c1fa31bdd4b41f5cfa2b0 100644 (file)
@@ -504,6 +504,14 @@ function dbesc($str) {
        }
 }
 
+function any_value_fallback($sql) {
+       //Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
+       //ANY_VALUE() is available from MySQL 5.7 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
+       //A standard fallback is to use MIN(), or nothing () in old MySQL 5.6-
+       //TODO: Skip this line when we know we are on a platform supporting ANY_VALUE()
+       return str_ireplace('ANY_VALUE(', 'MIN(', $sql);
+}
+
 // Function: q($sql,$args);
 // Description: execute SQL query with printf style args.
 // Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
@@ -514,6 +522,7 @@ function q($sql) {
        unset($args[0]);
 
        if ($db && $db->connected) {
+               $sql = any_value_fallback($sql);
                $stmt = @vsprintf($sql,$args); // Disabled warnings
                //logger("dba: q: $stmt", LOGGER_ALL);
                if ($stmt === false)
@@ -550,6 +559,7 @@ function qu($sql) {
        unset($args[0]);
 
        if ($db && $db->connected) {
+               $sql = any_value_fallback($sql);
                $stmt = @vsprintf($sql,$args); // Disabled warnings
                if ($stmt === false)
                        logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG);
index ed34288e8f3e30eaa0cafc3a384b1c66393a8cc2..370611b4eb438aaf69509aee01622e80d15436a9 100644 (file)
@@ -516,8 +516,9 @@ function notifier_run(&$argv, &$argc){
                                $r0 = Diaspora::relay_list();
                        }
 
-                       $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
-                               AND `uid` = %d AND `rel` != %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` GROUP BY `batch`, `id` ORDER BY rand()",
+                       $r1 = q("SELECT `batch`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`name`) AS `name`, ANY_VALUE(`network`) AS `network`
+                               FROM `contact` WHERE `network` = '%s'
+                               AND `uid` = %d AND `rel` != %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` GROUP BY `batch` ORDER BY rand()",
                                dbesc(NETWORK_DIASPORA),
                                intval($owner['uid']),
                                intval(CONTACT_IS_SHARING)
index 02d1b174039f4a1956b03cfb7459c08ff79120e0..b273c1726bbe4ce5ac797da46bd3cac834c1dfd4 100644 (file)
@@ -48,20 +48,20 @@ function photo_albums($uid, $update = false) {
                if (!Config::get('system', 'no_count', false)) {
                        /// @todo This query needs to be renewed. It is really slow
                        // At this time we just store the data in the cache
-                       $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`
+                       $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created`
                                FROM `photo`
                                WHERE `uid` = %d  AND `album` != '%s' AND `album` != '%s' $sql_extra
-                               GROUP BY `album`, `created` ORDER BY `created` DESC",
+                               GROUP BY `album` ORDER BY `created` DESC",
                                intval($uid),
                                dbesc('Contact Photos'),
                                dbesc(t('Contact Photos'))
                        );
                } else {
                        // This query doesn't do the count and is much faster
-                       $albums = qu("SELECT DISTINCT(`album`), '' AS `total`
+                       $albums = qu("SELECT DISTINCT(`album`), '' AS `total`, ANY_VALUE(`created`) AS `created`
                                FROM `photo`
                                WHERE `uid` = %d  AND `album` != '%s' AND `album` != '%s' $sql_extra
-                               GROUP BY `album`, `created` ORDER BY `created` DESC",
+                               GROUP BY `album` ORDER BY `created` DESC",
                                intval($uid),
                                dbesc('Contact Photos'),
                                dbesc(t('Contact Photos'))
index 05a8d36f68b4e2aa59f943e0509e3273bb02b27c..dd13d58be6c683d576fab86b3fed2f697094deff 100644 (file)
@@ -349,8 +349,8 @@ function message_content(App $a) {
 
                $o .= $header;
 
-               $r = q("SELECT count(*) AS `total` FROM `mail`
-                       WHERE `mail`.`uid` = %d GROUP BY `parent-uri`, `created` ORDER BY `created` DESC",
+               $r = q("SELECT count(*) AS `total` FROM `mail`, ANY_VALUE(`created`) AS `created`
+                       WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `created` DESC",
                        intval(local_user())
                );
 
@@ -528,12 +528,16 @@ function message_content(App $a) {
 }
 
 function get_messages($user, $lstart, $lend) {
-
+       //TODO: rewritte with a sub-query to get the first message of each private thread with certainty
        return q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`,
-               `mail`.* , `contact`.`name`, `contact`.`url`, `contact`.`thumb` , `contact`.`network`,
-               count( * ) as count
+               ANY_VALUE(`mail`.`id`), ANY_VALUE(`mail`.`uid`), ANY_VALUE(`mail`.`guid`), ANY_VALUE(`mail`.`from-name`),
+               ANY_VALUE(`mail`.`from-photo`), ANY_VALUE(`mail`.`from-url`), ANY_VALUE(`mail`.`contact-id`),
+               ANY_VALUE(`mail`.`convid`), ANY_VALUE(`mail`.`title`), ANY_VALUE(`mail`.`body`), ANY_VALUE(`mail`.`seen`),
+               ANY_VALUE(`mail`.`reply`), ANY_VALUE(`mail`.`replied`), ANY_VALUE(`mail`.`unknown`),
+               ANY_VALUE(`mail`.`uri`), ANY_VALUE(`mail`.`parent-uri`), ANY_VALUE(`mail`.`created`),
+               ANY_VALUE(`contact`.`name`), ANY_VALUE(`contact`.`url`), ANY_VALUE(`contact`.`thumb`), ANY_VALUE(`contact`.`network`),
                FROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id`
-               WHERE `mail`.`uid` = %d GROUP BY `parent-uri`, `mail`.id ORDER BY `mailcreated` DESC  LIMIT %d , %d ",
+               WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `mailcreated` DESC  LIMIT %d , %d ",
                intval($user), intval($lstart), intval($lend)
        );
 }
index a24cee2559627a2d68a33a785c203dd6befd988e..8e4782977437448d6f25a1673e7f02a03b8811d2 100644 (file)
@@ -1240,8 +1240,10 @@ function photos_content(App $a) {
                        $order = 'DESC';
                }
 
-               $r = q("SELECT `resource-id`, `id`, `filename`, type, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
-                       AND `scale` <= 4 $sql_extra GROUP BY `resource-id`, `id` ORDER BY `created` $order LIMIT %d , %d",
+               $r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,
+                       ANY_VALUE(`type`) AS `type`, max(`scale`) AS `scale`, ANY_VALUE(`desc`) as `desc`
+                       FROM `photo` WHERE `uid` = %d AND `album` = '%s'
+                       AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT %d , %d",
                        intval($owner_uid),
                        dbesc($album),
                        intval($a->pager['start']),
index ea2e0d4a24f08ca84c0cca7d6406757e8f601812..269d537854c5467f4fbb9ceef166a15017735168 100644 (file)
@@ -356,9 +356,11 @@ function videos_content(App $a) {
                $a->set_pager_itemspage(20);
        }
 
-       $r = q("SELECT hash, `id`, `filename`, filetype FROM `attach`
+       $r = q("SELECT hash, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`created`) AS `created`,
+               ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`filetype`) as `filetype`
+               FROM `attach`
                WHERE `uid` = %d AND filetype LIKE '%%video%%'
-               $sql_extra GROUP BY hash, `id` ORDER BY `created` DESC LIMIT %d , %d",
+               $sql_extra GROUP BY hash ORDER BY `created` DESC LIMIT %d , %d",
                intval($a->data['user']['uid']),
                intval($a->pager['start']),
                intval($a->pager['itemspage'])