簡體   English   中英

帶聯合和順序的sql語句

[英]sql statement with union and order by

這個SQL很好用,但是一旦我想使用ORDER BY id來排序我的選擇,它將無法工作。 所有這些表都有一個id類型int

$sth = $this->db->prepare("SELECT r1, r2, r3, r4
    FROM table1
        WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
    UNION
        SELECT   r1, r2, r3, r4  FROM table2
            WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
    UNION
        SELECT   r1, r2, r3, r4  FROM table3
            WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
    UNION
        SELECT   r1, r2, r3, r4  FROM table4
            WHERE name LIKE '%{$key}%'  AND status = 1 LIMIT 0,20 ");

$sth->execute();
$data = $sth->fetchAll();
  • 必須在每個選擇上都包含ID以保持結構相等。
  • 然后將所有內容放在解析之間,並在需要時分配別名。 ( a union b union c ) as ALIAS
  • 最后做的select上表的別名SELECT * FROM ALIAS ORDER BY ID

$sth = $this->db->prepare(" SELECT * FROM (
     SELECT   id, r1, r2, r3, r4  FROM table1 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
     UNION
     SELECT   id, r1, r2, r3, r4  FROM table2 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
     UNION
     SELECT   id, r1, r2, r3, r4  FROM table3 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0,20 
     UNION
     SELECT   id, r1, r2, r3, r4  FROM table4 WHERE name LIKE '%{$key}%'  AND status = 1 LIMIT 0,20 
) as Alias ORDER BY ID");
$sth->execute();
$data = $sth->fetchAll();

要在union的組件中使用order by ,您需要將子查詢括在括號中。 然后,您可以在最后添加order by 因此,此結構將起作用:

(SELECT id, r1, r2, r3, r4 FROM table1 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0, 20
) UNION
(SELECT id, r1, r2, r3, r4  FROM table2 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0, 20 
) UNION
(SELECT id, r1, r2, r3, r4  FROM table3 WHERE name LIKE '%{$key}%' AND status = 1 LIMIT 0, 20 
) UNION
(SELECT id, r1, r2, r3, r4  FROM table4 WHERE name LIKE '%{$key}%'  AND status = 1 LIMIT 0, 20)
ORDER BY id;

注意:使用此結構時,如果要按順序進行排序,則需要在列列表中包含id

暫無
暫無

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

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