[英]php PDO MySQL Select results of one table based on array of results from another table
[英]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_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
}
但這是棘手的部分...
然后我要訂購從表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.