根据另一个SQL PHP

时间:2016-01-31 02:00:15

标签: php mysql sql join

我知道这涉及到JOINS,但我似乎找不到我正在尝试做的工作解决方案。

我有2个自定义表格:

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

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

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

然后将 table2 中的 track_id table1 的结果进行匹配,以便我可以遍历 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

}

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

然后,我希望从 table2 <日期 DESC 订购来自 table1 的$结果/强>

这就是我失去的地方......

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

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

除了最后一点之外,我知道我可以使用JOINS完成这整个例程,将这一切保存在一个查询中并使其更有效但我不知道如何。

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

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

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

$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);

1 个答案:

答案 0 :(得分:2)

尝试使用此查询

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,所以没有具体原因,我只按照逻辑顺序),使用您指定的条件iud=55 and active=1

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

2.-但正如您所说,您需要使用table2中的一些信息扩展table1中检索到的数据,这正是JOIN所指示的内容,我们是使用INNER JOIN,因为只有在table1上存在uid = 55的数据时,这种类型的JOIN才会显示行,如果两个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,我希望所有找到的行按表2中的字段顺序下降;

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;

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