Mysql

Mysql - 顯示 3 個表的結果,不包括某些欄位的 NULL 或 EMPTY 值

  • January 29, 2013

我有 3 個簡單的表,其中polls,usersvotes。我想顯示按乾淨的票數排序的所有民意調查(有時要麼插入,poll_id要麼user_id不插入)。

此外,我想顯示一個投票的使用者列表,類似於 fb (現在我的解決方案是使用 ajax 呼叫獲取的新查詢來獲取該列表。)

創建一個查詢以獲取所有結果並從數組中單獨讀取它們會更好,還是創建單獨的請求是最佳實踐?

下面的查詢確實獲得了有序列表,但包含空行或空行,並且對於具有 >10000 個結果的表來說非常慢。有什麼建議?

SELECT id, 
 title, 
 pollid, 
 COUNT(pollid) AS clean_count 
FROM 
(
 SELECT DISTINCT user_id, pollid 
 FROM tbl_votes
) AS tmp_tbl 
JOIN tbl_polls 
 ON tbl_polls.id = tmp_tbl.pollid 
WHERE not isnull(tmp_tbl.user_id) 
GROUP BY pollid 
ORDER BY clean_count DESC

將投票結果與選民匹配的程式碼:

SELECT DISTINCT fbid, COALESCE(username, 'User not found.') 
AS username 
FROM tbl_votes JOIN tbl_users 
ON tbl_users.fbid = tbl_votes.user_id 
WHERE pollid = $band_id AND not isnull(username)

嘗試這個:

SELECT id, 
 title, 
 pollid, 
 COUNT(pollid) AS clean_count,
 group_concat(DISTINCT u.name) AS user
FROM 
(
 SELECT DISTINCT user_id, pollid 
 FROM tbl_votes
) AS tmp_tbl 
JOIN tbl_polls 
 ON tbl_polls.id = tmp_tbl.pollid
JOIN tbl_users AS u 
ON tmp_tbl.user_id = u.user_id
WHERE not isnull(tmp_tbl.user_id) 
GROUP BY pollid 
ORDER BY clean_count DESC

這是我使用的範例數據:

   CREATE TABLE tbl_polls (
 id INT AUTO_INCREMENT PRIMARY KEY,
 title VARCHAR(50)
 );


CREATE TABLE tbl_users (
 user_id INT AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(50)
 );

CREATE TABLE tbl_votes (
 id INT AUTO_INCREMENT PRIMARY KEY,
 pollid INT,
 user_id INT,
 INDEX (pollid,user_id),
 FOREIGN KEY (pollid) REFERENCES tbl_polls(id),
 FOREIGN KEY (user_id) REFERENCES tbl_users(user_id)
 );

INSERT INTO tbl_polls (title)
VALUES ('Title 1'),('Title 2'),('Title 3');


INSERT INTO tbl_users (name)
VALUES ('Bob'),('Jack'),('Joe'),('Tom');

INSERT INTO tbl_votes (pollid,user_id)
VALUES (1,2),(1,2),(1,2),(1,3),(2,4),(2,1),(2,4),(2,4),(3,1),(2,1),(1,4);

SQL 小提琴展示

我已經使用 group concat 來獲取您列表的名稱。此外,為了加速您的數據庫,您是否嘗試過向外鍵添加索引?

順便說一句,我不明白你的評論,有些選票缺少 pollid 和 user_id。如果是這樣的話,看看這個。

引用自:https://dba.stackexchange.com/questions/33570