我知道这涉及到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);
答案 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;
如果不完全清楚,你可以问......