【问题标题】:mysql returning 1 row per id/namemysql 每个 id/name 返回 1 行
【发布时间】:2018-05-23 18:10:40
【问题描述】:

我想加入 3 个表并得到它们的结果,没有任何重复

SELECT * FROM `database`.project 
INNER JOIN post on project.id = post.project_id 
INNER JOIN media on media.post_id = post.id 
;

电流输出

我想知道输出是否类似于

floaty
Headphone
fasion + technolgie

我尝试使用 distinct 函数。但它只返回我想返回连接表的名称,因为我仍然想使用该数据。

models.py

我正在使用 Project.with_media()

"""models."""
from app import db
from peewee import *
import datetime


class Project(Model):
    """Projects."""

    name = CharField(unique=True)
    content = CharField()
    created_date = DateTimeField(default=datetime.datetime.today())

    class Meta(object):
        """Select database."""

        database = db

    def get_project_media(self):
        """Grab image from get_posts."""
        post = Post.select().where(Post.project_id == self).get()
        return Media.select().where(Media.post_id == post).get().media

    def check_media(self):
        """Check if project has media."""
        try:
            post = Post.select().where(Post.project_id == self).get()
            Media.select().where(Media.post_id == post.id).get()
            print('True')
            return True
        except DoesNotExist:
            print('False')
            return False

这是我的电话,所以我可以在 jinja 引擎上显示它

    def with_media():
        """Grab image from get_posts."""
        return (Project.select(Project, Post, Media)
                    .join(Post)
                    .join(Media)
                    .where(Post.id == Media.post_id
                           and
                           Project.id == Post.project_id))

    def posts(self):
        """Return all posts that are accosicated with this project."""
        return Post.select().where(Post.project_id == self)

    def media_post(self):
        """Return all posts that are accosicated with this project."""
        post = Post.select().where(Post.project_id == self)
        return post.get_media()
        # return Media.select().where(Media.post_id == post).get()



class Post(Model):
    """Model for posts."""

    project = ForeignKeyField(Project, backref='Post', null=True, default=None)
    name = CharField()
    content = TextField()
    "Media Model"
    "Category Model"
    "Project Model"
    created_date = DateTimeField(default=datetime.datetime.today())

    class Meta(object):
        """Select database."""

        database = db

    def get_category(self):
        """Grab all the posts from project."""
        return (Category.select()
                .where(Category.post_id == self))

    def get_media(self):
        """Grab all media from this post."""
        return (Media.select()
                .where(Media.post_id == self))

    def standalone():
        """Return a model of all posts not bound to a project."""
        return (Post.select()
                .where(Post.project.is_null())
                .order_by(Post.created_date.desc()))

    def date():
        """Return dates order_by."""
        return(Post.select()
               .order_by(Post.created_date.desc()))


class Media(Model):
    """Media for post."""

    post = ForeignKeyField(Post, backref='Media')
    media = CharField()

    class Meta(object):
        """Select database."""

        database = db


class Category(Model):
    """model for all avaible category's."""

    post = ForeignKeyField(Post, backref='Category')
    name = CharField()

    class Meta(object):
        """Select database."""

        database = db

    def get_name():
        """Get all category's without overlaping."""
        categorys = Category.select()
        categoryList = []
        for category in categorys:
            categoryName = category.name.title()
            if categoryName not in categoryList:
                categoryList.append(categoryName)
        return categoryList


def initialize():
    """Create tables."""
    db.connect()
    db.create_tables([Category, Project, Post, Media], safe=True)
    db.close()

main.py

我想用 media() 函数调用项目,这样我就可以使用数据库项来调用图像和显示内容

<ul class='projects'>
    {% for project in projects.with_media() %}
            {% if loop.index <= 3 %}
                <li class='project_w'>
                    <img src="{{project.media_post()}}" alt="">
                    <a href="{{url_for('project', id=project.id)}}">
                    <h2>{{project.name}}</h2>
                    </a>
                </li>
            {% else %}
                <li class='project_h'>
                    <img src="{{project.post.media.media}}" alt="">
                    <a href="{{url_for('project', id=project.id)}}">
                    <h2>{{project.name}}</h2>
                    </a>
                </li>
            {% endif %}
    {% endfor %}
</ul>

【问题讨论】:

  • 为什么要开始多行?我假设project.id 是独一无二的,所以在某个地方,每个 ID 都有多行,但根据你的结果,你不应该这样做。发布表架构和表中的相关示例行。请勿发布图片。
  • 您需要将预期输出编辑为实际输出。您说自己想要这些名称。你想要什么做什么
  • 我希望名称与模型 media.media 一起使用,以便在 jinja 中更容易呈现,我编辑了示例以使其更清晰。

标签: python sql flask jinja2 peewee


【解决方案1】:

问题:

.where(Post.id == Media.post_id
                       and
                       Project.id == Post.project_id))

您必须使用“&”而不是“and”。请看http://docs.peewee-orm.com/en/latest/peewee/query_operators.html

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多