【问题标题】:MYSQL RAND() will not generate correct listingMYSQL RAND() 不会生成正确的列表
【发布时间】:2016-06-26 15:36:37
【问题描述】:

我无法从我的选择中获得正确的结果。表 wp_rdp_category_images 有 3 列:id(唯一)- category_name - category_image。

在下面的选择中,我需要最多 4 x category_name 和每个 category_name 中的 1 个 category_image。

有人可以帮我纠正这个选择吗?会非常好。提前致谢。

这里是php代码:

function show_game_category_images_func() {
    $content = '';
    $i = 1;
    $record = $GLOBALS['wpdb']->get_results('
    SELECT * FROM wp_rdp_category_images
    ORDER BY `category_name`, RAND()
    LIMIT 4 
    ');

    if($record){
        foreach($record as $key => $rec){                   
            // if($key == 'picture' && $rec != null && $rec != '')     
            $rec = '<img src="'.$upload_url.$record->category_image.'" width="150" height="150">';

            if ($i == 1) {
                echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span>';  // even
            }
            if ($i == 2) {
                echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span><br>';  // even
            }
            else {
                echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span>';   // odd
            }
            $i++;
        }
    }   
    return $content;
}
add_shortcode('show_game_category_images', 'show_game_category_images_func');

我的 SQL:

SELECT * FROM `wp_rdp_category_images`    
ORDER BY `category_name`, RAND() LIMIT 4

这是一个测试表:

CREATE TABLE IF NOT EXISTS `wp_rdp_category_images` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `category_name` varchar(32) NOT NULL,
  `category_image` varchar(64) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;

INSERT INTO `wp_rdp_category_images` (`id`, `category_name`, `category_image`) VALUES
(1, 'natuur', 'natuur1.jpg'),
(2, 'natuur', 'natuur4.jpg'),
(4, 'aarde', 'aarde3.jpg'),
(5, 'sport', 'sport2.jpg'),
(6, 'aarde', 'aarde3.jpg'),
(7, 'auto', 'autogrijs.jpg'),
(8, 'auto', 'autowit.jpg'),
(9, 'auto', 'autoblack.jpg'),
(10, 'auto', 'autoroodzwart.jpg'),
(11, 'aarde', 'aarde1.jpg'),
(12, 'aarde', 'aarde2.jpg'),
(13, 'sport', 'sport4.jpg'),
(14, 'sport', 'sport3.jpg'),
(15, 'sport', 'sport1.jpg'),
(16, 'natuur', 'natuur2.jpg'),
(17, 'natuur', 'natuur3.jpg'),
(18, 'people', 'people1.jpg'),
(19, 'people', 'people2.jpg'),
(20, 'people', 'people3.jpg'),
(21, 'people', 'people4.jpg'); 

【问题讨论】:

  • 你想要什么?让它选择正确的随机行!您有什么错误想与我们分享吗?您可以显示一些预期结果?
  • 我也没有错误。只需要 4 个唯一的类别名称,包括相关图像。喜欢这个结果:natuur', 'natuur1.jpg aarde', 'aarde3.jpg auto', 'autowit.jpg people', 'people2.jpg
  • 哦,那这变成了一个有趣的问题。这是我的赞成票(对于其中有趣的部分)。但请注意,并非所有数据都是唯一的(不包括 auto_inc)
  • 没错。排除 id 字段,其余部分不是唯一的。我有很多带有图像的类别名称。但我需要最多 4 个才能从我的选择中获得。表中的 4 个唯一名称。我没有提及一个独特的领域。
  • 澄清一下:听起来您想要一个包含四个随机选择的类别的结果集。与每个类别相关联,您希望从该类别的图像中随机选择一张图像。那是对的吗?请edit您的问题澄清一下。

标签: php mysql select


【解决方案1】:

你可以使用这个查询:

select     category_name,
           (select   category_image
            from     wp_rdp_category_images
            where    category_name = main.category_name
            order by rand()
            limit    1) category_image
from       wp_rdp_category_images main
group by   category_name
order by   rand()
limit      4

SQL Fiddle

如果您需要结果集中的所有列,请使用此变体:

select     main.*
from       (
            select     category_name,
                       (select   id
                        from     wp_rdp_category_images
                        where    category_name = main.category_name
                        order by rand()
                        limit    1) id
             from       wp_rdp_category_images main
            ) sub
inner join  wp_rdp_category_images main
        on  main.id = sub.id
group by    main.category_name
order by   rand()
limit      4

SQL Fiddle

PHP 代码

您的 PHP 存在问题,因此第一行重复。请注意,当 $i 为 1 时,您将同时执行第一个 if 中的部分,但执行第二个 ifelse 中的部分。

您需要在第二个if 之前添加一个else

if ($i == 1) {
    echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span>';  // even
} else if ($i == 2) { // !!!! ADDED "else" here!
    echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span><br>';  // even
}
else {
    echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span>';   // odd
}

但是您的 cmets 似乎建议您要制作两列。在这种情况下,最好这样写:

echo '<span><img src="'.$upload_url.$rec->category_image.'" ></span>';  // all
if ($i % 2 == 0) echo '<br>';  // even only

【讨论】:

  • 奇怪,你检查过小提琴吗?有五个图像,因为有 5 个类别。您想省略哪个类别?也是随机的?我将它添加到查询和小提琴中。
  • 我需要最多 4 个结果。来自每只猫的随机 cat_name + 随机 cat_image
  • 奇怪。如果我进行最后一次更新并限制 2,我会得到 3。当 limit = 4 我得到 5 作为结果。这两个结果都不是唯一的。
  • 你检查过小提琴吗?你在做什么不同的事情?一定有什么……
  • 您的更新在 phpmyadmin 中确实可以正常工作,但在 php 中却不行。
【解决方案2】:

类似随机 id 的东西

SELECT DISTINCT category_name, category_image
FROM `wp_rdp_category_images`
WHERE `id` > RAND() * (SELECT MAX(id) FROM `wp_rdp_category_images`)   
ORDER BY id
0 LIMIT 4

在代码中按category_name 手动排序4 个结果。

【讨论】:

  • 是的,必须按 id 订购。还有更多
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多