簡體   English   中英

根據另一個SQL PHP的結果從一個表獲取數據

[英]Getting data from one table based on results of another SQL PHP

我知道這涉及到JOINS,但是我似乎找不到我想要做的可行的解決方案。

我有2個自定義表:

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

首先,我想從table2中選擇所有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

}

但這是棘手的部分...

然后我要訂購表1表2 日期 DESC的$結果

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

實際上我想要(偽代碼):

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

嘗試使用此查詢

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檢索所有行(沒有特殊原因,因為我在table1使用了table2 ,我只是遵循邏輯順序),請使用您指定的標准iud=55 and active=1

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

2.-但是正如您所說,您需要使用table1中的一些信息來擴展在table2檢索到的數據,這正是JOIN指令所做的,並且我們正在使用INNER JOIN,因為這種類型的JOIN僅在以下情況下顯示行: uid = 55存在於table1上,如果兩個表上都沒有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和在這種情況下是t1(t1。*)的一個表中的track_id),並且僅顯示從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;

如果不是很清楚,你可以問...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM