You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core实现:按父ID从子表随机获取指定数量数据

按父ID从子表随机获取指定条数数据的实现方案

1. SQL 查询实现

核心思路是通过窗口函数按ColorId分组,随机排序后取每组前3条数据,以下是不同数据库的实现语句:

MySQL/MariaDB

SELECT t.Id, t.ColorId, t.Name
FROM (
    SELECT 
        Id, ColorId, Name,
        ROW_NUMBER() OVER (PARTITION BY ColorId ORDER BY RAND()) AS rn
    FROM 子表名
) t
WHERE t.rn <= 3;

PostgreSQL

SELECT t.Id, t.ColorId, t.Name
FROM (
    SELECT 
        Id, ColorId, Name,
        ROW_NUMBER() OVER (PARTITION BY ColorId ORDER BY RANDOM()) AS rn
    FROM 子表名
) t
WHERE t.rn <= 3;

SQL Server

SELECT t.Id, t.ColorId, t.Name
FROM (
    SELECT 
        Id, ColorId, Name,
        ROW_NUMBER() OVER (PARTITION BY ColorId ORDER BY NEWID()) AS rn
    FROM 子表名
) t
WHERE t.rn <= 3;

如果需要关联父表获取颜色名称,可添加JOIN(以MySQL为例):

SELECT p.Name AS ColorName, t.Id, t.ColorId, t.Name AS ItemName
FROM (
    SELECT 
        Id, ColorId, Name,
        ROW_NUMBER() OVER (PARTITION BY ColorId ORDER BY RAND()) AS rn
    FROM 子表名
) t
LEFT JOIN 父表名 p ON t.ColorId = p.Id
WHERE t.rn <= 3
ORDER BY p.Name;

2. 后端处理示例(Python Flask)

以下是通过Flask连接数据库,查询并整理数据的示例:

from flask import Flask, jsonify
import mysql.connector

app = Flask(__name__)

@app.route('/random-items')
def get_random_items():
    db = mysql.connector.connect(
        host="localhost",
        user="你的数据库用户名",
        password="你的数据库密码",
        database="你的数据库名"
    )
    cursor = db.cursor(dictionary=True)
    query = """
        SELECT p.Name AS ColorName, t.Id, t.ColorId, t.Name AS ItemName
        FROM (
            SELECT 
                Id, ColorId, Name,
                ROW_NUMBER() OVER (PARTITION BY ColorId ORDER BY RAND()) AS rn
            FROM 子表名
        ) t
        LEFT JOIN 父表名 p ON t.ColorId = p.Id
        WHERE t.rn <= 3
        ORDER BY p.Name;
    """
    cursor.execute(query)
    results = cursor.fetchall()
    
    # 按颜色分组整理返回数据
    grouped_data = {}
    for item in results:
        color = item['ColorName']
        if color not in grouped_data:
            grouped_data[color] = []
        grouped_data[color].append({
            'item_id': item['Id'],
            'item_name': item['ItemName']
        })
    
    cursor.close()
    db.close()
    return jsonify(grouped_data)

if __name__ == '__main__':
    app.run(debug=True)

3. 前端展示示例(HTML + JavaScript)

通过AJAX获取后端数据,渲染到页面上:

<!DOCTYPE html>
<html>
<head>
    <title>随机颜色条目展示</title>
    <style>
        .color-group {
            margin: 20px;
            padding: 15px;
            border: 1px solid #eee;
            border-radius: 6px;
        }
        .color-group h3 {
            margin-top: 0;
            color: #333;
        }
        .item-list {
            list-style-type: none;
            padding-left: 0;
        }
        .item-list li {
            padding: 5px 0;
            color: #666;
        }
    </style>
</head>
<body>
    <div id="color-container"></div>

    <script>
        fetch('/random-items')
            .then(res => res.json())
            .then(data => {
                const container = document.getElementById('color-container');
                Object.keys(data).forEach(color => {
                    const group = document.createElement('div');
                    group.className = 'color-group';
                    group.innerHTML = `
                        <h3>${color}</h3>
                        <ul class="item-list">
                            ${data[color].map(item => `<li>${item.item_name} (ID: ${item.item_id})</li>`).join('')}
                        </ul>
                    `;
                    container.appendChild(group);
                });
            })
            .catch(err => console.error('加载数据出错:', err));
    </script>
</body>
</html>

内容的提问来源于stack exchange,提问作者RoyalDesigner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:30:18