【问题标题】:Aid with SQL query for my JAVA application帮助我的 JAVA 应用程序的 SQL 查询
【发布时间】:2016-03-29 23:25:28
【问题描述】:

我不是一个 SQL 专家,如果以前有人问过类似的问题,请原谅我。我什至不确定我需要搜索什么才能学习这个。因为我只需要在我认为我可以证明要求的时候做这样的事情。

我正在编写我的第一个需要与在线数据库对话的 Android 应用程序,并且已经成功编写了几个与我的应用程序配合良好的 SQL 查询,但是对于我的基本知识来说,这个有点复杂。

下面我提供了一个我认为至少具有 SQL 基本知识的任何人都可以理解的示例。我想知道是否有任何善良的灵魂能够帮助我提出一个查询或给我一些关于我需要做什么的见解。提前致谢!

伪样本:

SELECT * 
FROM events 
WHERE user_has_event.user_user_id = user.user_id AND user_has_event.attendance = 1 OR 2
JOIN attendance

这是我的表格的基本视觉效果(没有用户表格):

Event Table                          User_has_event Table
-----------------------------------  ---------------------------------------
|event_id|event_name|event_society|  |user_user_id|event_event_id|attendance|
-----------------------------------  ---------------------------------------
|        |          |             |  |            |              |          |

这是我想要的结果:

Outcome Table
----------------------------------------------
|event_id|event_name|event_society|attendance|
----------------------------------------------
|        |          |             |          |   

【问题讨论】:

    标签: mysql sql database phpmyadmin


    【解决方案1】:

    由于您对 SQL 的了解是基本知识,因此我将对 Andy 的回答进行一些扩展(好吧,事实证明,相当多)。首先,t1t2 不是必需的,但它们很方便。您可以直接引用表,如果字段名称是唯一的,则不必这样做。你可以这样做:

    SELECT
    events.event_id,
    events.event_name,
    events.event_society,
    user_has_event.attendance
    FROM
    events
    INNER JOIN user_has_event ON events.event_id = user_has_event.event_event_id
    

    如您所见,这是相当冗长和乏味的。因此,当您第一次引用表格时,您可以像 Andy 所做的那样,立即在其后面加上一个缩写词,实际上这通常被认为是最佳实践。现在,您也可以这样做:

    SELECT
    event_id,
    event_name,
    event_society,
    attendance
    FROM
    events
    INNER JOIN user_has_event ON event_id = event_event_id
    

    您可以避免这种情况,因为所有字段名称在您的 SELECT 语句访问的表中都是唯一的。由于这通常不是真的,这不是一个好主意,因为很容易错过一个模棱两可的参考。安迪是最好的方法。现在,您可能已经不遗余力地使用不同的字段名称,因为您不知道可以使用 Table.Field 语法引用该表。使用相同的字段名称通常更清晰;不同的人对此有不同的感受。我通常只使用“ID”作为每个表中的主键。这很有效,因为您可以通过使用 Table.Field 来引用字段来解决歧义。

    这导致您会发现它有助于了解的下一件事,即您可以使用 AS 关键字将您想要的任何字段名称分配给输出。假设我这样重命名您的字段:

    Event
        ID
        Name
        Society
    
    UserEvent
        ID
        EventID
        Attendance
    

    现在,看看这个:

    SELECT
    e.ID AS 'Event ID',
    e.Name AS 'Event Name',
    e.Society AS 'Event Society',
    ue.Attendance
    FROM
    Events e
    INNER JOIN UserEvent ue ON e.ID = ue.EventID
    

    现在您已将所选字段的名称与结果中的字段名称分离,这应该可以让您省去头疼的问题。一个重要的原则是存储数据的方式和格式化数据输出的方式应该是松散耦合的。您不希望考虑您希望输出数据的外观来决定您应该如何命名字段,因此您需要了解这些内容。

    现在,让我们假设您也有一个 User 表(您可能有)。假设它看起来像这样(可能不是):

    User
        ID
        FirstName
        LastName
        OtherStuff
    

    现在,我们将修改 UserEvent 表,为 User 表添加一个外键:

    UserEvent
        ID
        EventID
        UserID
        Attendance
    

    现在,看看这个:

    SELECT
    e.Name AS 'Event Name',
    e.Society AS 'Event Society',
    u.LastName + ', ' + u.FirstName AS 'User Name',
    ue.Attendance
    FROM
    Events e
    JOIN UserEvent ue ON e.ID = ue.EventID
    JOIN User u ON u.ID = ue.UserID
    

    这应该为您提供基础知识,除了 WHERE 子句,您可以自己学习这些基础知识(也可以随意询问有关 WHERE 子句的问题)。

    附注:JOIN 与 INNER JOIN 相同,是最常见的连接类型,表示两个集合的交集。还有 LEFT、RIGHT 和(有时)OUTER 连接。我一般只说JOIN而不是INNER JOIN;再次,不同的人对此有不同的感受。一致性是这里最重要的原则。

    【讨论】:

    • 这是一个非常令人印象深刻的答案!我现在正在研究它.. 到目前为止,我尝试根据 user_id 显示结果是成功的。
    • 完美,原来我将 where 子句放在了错误的位置,我会正确实施并接受您的回答。感谢您花时间在这方面,它非常有用!
    • 不客气。很高兴您自己对 WHERE 子句进行了排序。
    【解决方案2】:

    您可以类似地添加到 USER 表中...但是对于您请求的基本输出,请参见以下内容

    SELECT
    t1.event_id,
    t1.event_name,
    t1.event_society,
    t2.attendance
    FROM
    events t1
    INNER JOIN user_has_event t2 ON t1.event_id = t2.event_event_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2011-10-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多