【问题标题】:Getting data from one table based on results of another SQL PHP根据另一个 SQL PHP 的结果从一个表中获取数据
【发布时间】:2016-01-31 02:00:14
【问题描述】:

我知道这涉及到 JOINS,但我似乎无法为我正在尝试做的事情找到可行的解决方案。

我有 2 个自定义表格:

table1    |    table2
---------------------
id             id
uid            uid
track_id       track_id
date           date
art            active
info
blah
blah2

首先,我想从 table2 中选择 WHERE uid=55 AND active=1 的所有内容:

$tracks = $wpdb->get_results( "SELECT * FROM table2 WHERE uid = 55 AND active = 1");

然后将 table2 中的 track_idtable1 中的结果进行匹配,以便我可以遍历 table1 数据。

我知道我可以这样做:

foreach( $tracks as $track ) {

$this_track = $track->track_id;

$results = $wpdb->get_results( "SELECT * FROM table1 WHERE track_id = $this_track");

// Do stuff here

}

但这就是它变得棘手的部分......

然后我想从 table2date DESC ORDER table1 中的 $results /strong>

这就是我迷路的地方......

实际上我想要(伪代码):

$results = $wpdb->get_results( "SELECT * FROM table1 WHERE track_id = $this_track" ORDER BY date DESC FROM table2);

除了最后一点,我知道我可以使用 JOINS 完成整个例程,以将这一切集中在一个查询中并提高效率,但我只是不知道如何。

所以为了清楚起见,我的整体例程应该是这样的:

从 table2 中获取 user_id=55 和 active=1 的所有 track_id 实例,然后使用这些结果将 track_id 与 table1 中具有相同 track_id 的每个结果相匹配,然后从 table2 按日期对结果进行排序

伪代码,我知道它包含废话:

$finalresults = $wpdb->get_results( "SELECT * FROM table2 where uid=55 AND active=1 THEN SELECT * FROM table1 WHERE track_id = "the track_id from the first query" THEN ORDER BY date DESC FROM table2);

【问题讨论】:

    标签: php mysql sql join


    【解决方案1】:

    试试这个查询

    SELECT t1.* ,t2.date AS t2date, t2.active FROM table2 AS t2 INNER JOIN table1 AS t1 ON (t1.track_id = t2.track_id) WHERE t2.uid=55 AND t2.active=1 ORDER BY t2.date DESC;
    

    编辑:说明此查询在做什么。并反转查询中检索到的表的顺序(这不会影响最终的数据集,我这样做是为了遵循解释的逻辑。

    1.- 从table2 检索所有行开始(没有具体原因,因为我使用table2 而不是table1,我只是按照逻辑顺序),使用您指定的条件@987654325 @

    SELECT * FROM table2 WHERE uid=55 AND active=1;
    

    2.- 但正如您所说,您需要使用table1 中的一些信息来扩展在table2 中检索到的数据,这正是 JOIN 所做的指令,我们使用 INNER JOIN 因为这种类型的 JOIN仅当 table1 上存在 uid=55 的数据时才会显示行,如果两个 TABLES 上都没有 uid=55 的数据,则 mysql 将显示为空的记录集(选择了 0 行)。

    ON(...) 部分中,我指定mysql 将使用哪些标准来比较两个表是否匹配,在这种情况下,将比较table2 上的track_id,它与table1 上指定的相同,如果满足此条件,则mysql 会考虑它作为匹配。

    只是为了方便起见,因为我要添加第二张表,所以我为 t1 和 t2 分别指定了一个别名。

    那么查询现在看起来像这样

    SELECT * FROM table2 AS t2 INNER JOIN table1 AS t1 ON(t1.track.id = t2.track_id) WHERE t2.uid=55 AND t2.active=1;
    

    3.- 但随后引发了一个问题,两个表都有具有相同字段名称的行,这是 DBMS 在其查询中不喜欢的东西,为了避免在查询中出现这种情况,我只显示字段(id , uid 和 track_id) 来自一个表,在这种情况下为 t1 (t1.*),并且仅显示从 t2 (t2.date AS t2date, t2.active) 中没有此问题的字段。这样mysql就不会报错了。

    SELECT t1.* ,t2.date AS t2date, t2.active FROM table2 AS t2 INNER JOIN table1 AS t1 ON (t1.track_id = t2.track_id) WHERE t2.uid=55 AND t2.active=1;
    

    4.- 对于最后一步,我向 mysql 指定我希望所有找到的行按 table2 中的一个字段排序;

    ORDER BY t2.date DESC; 
    

    然后此条件将应用于整个选定的行。并且最终的查询具有这种形式。

    SELECT t1.* ,t2.date AS t2date, t2.active FROM table2 AS t2 INNER JOIN table1 AS t1 ON (t1.track_id = t2.track_id) WHERE t2.uid=55 AND t2.active=1 ORDER BY t2.date DESC;
    

    如果不完全清楚可以问...

    【讨论】:

    • 是的,成功了,谢谢兄弟!你介意解释一下你做了什么吗?我需要学习这个。
    • 当然,让我扩展这个答案
    • @Grant 回答展开
    • 感谢您的详尽解释。我将需要经过几次才能正确下沉,但现在对我来说更有意义了。
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多