Mysql
Mysql - 顯示 3 個表的結果,不包括某些欄位的 NULL 或 EMPTY 值
我有 3 個簡單的表,其中
polls
,users
和votes
。我想顯示按乾淨的票數排序的所有民意調查(有時要麼插入,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);
我已經使用 group concat 來獲取您列表的名稱。此外,為了加速您的數據庫,您是否嘗試過向外鍵添加索引?
順便說一句,我不明白你的評論,有些選票缺少 pollid 和 user_id。如果是這樣的話,看看這個。