2017-07-26 63 views
0

所以,想象我在每一個即用戶 10第3個相關的表,設置activitylogs。很顯然users table將有一個id列作爲其主鍵,而settings tableactivitylogs table將有一個user_id列。運行下面的查詢將返回所有列,包括表settingsactivitylogs中的users table,user_id列中的id列。如何從我的'SELECT *'語句中排除列?

select * from users 
    inner join settings on users.id = settings.user_id 
    inner join on activitylog on users.id = activitylogs.user_id 

的問題是,我不希望得到其他表user_id列,我不想寫出來一個非常長的查詢確定所有我想要得到的列。所以我想我可以創建一個類似於這樣的查詢

select all except id from users 

它也可以與連接一起使用。

select all except activitylogs.user_id, settings.user_id from users 
    inner join settings on users.id = settings.user_id 
    inner join activitylogs on users.id = activitylogs.user_id 

這實際上會返回除明確指定的所有列。

  • 我該怎麼做?我的意思是我需要使用哪些編程語言,或者我必須編輯mysql的源代碼還是做類似的事情?
  • 這樣做會合法嗎?因爲我想在避免訴訟的同時做到這一點。

如果您有任何可以說與此相關的內容,或者如果您可以將我指向任何與此相關的博客文章,請這樣做。

+2

有一條基本規則:*不要編寫SELECT *'n生產代碼,因爲沒有人知道按哪個順序返回哪些列(並且ALTER TABLE可能會更改它)。你提出的只是一個變化。標準SQL支持'join .. using',它只返回一個連接列而不是重複它。 – dnoeth

+0

@dnoeth但仍然會包含'user_id'列嗎?如果我的建議無法完成,那麼如何在避免非常長的mysql查詢的情況下實現相同的結果? –

+0

您只需列出您想要的列,這通常比所有列都少。順便說一句,大多數SQL編輯器可以幫助創建一個列列表... – dnoeth

回答

0

一般而言,您會編寫一個查詢來僅返回所需的列,以便對結果進行更大程度的控制,即使是,這也涉及必須列出三十列 - 這是一項成本,畢竟。

請考慮將來的更新可能會向用戶表中添加更多列(可能是其中存儲了大量HTML的備註列),或包含用戶的編碼圖像的列或掃描並保存的列文件。使用你的方法(或者通常選擇*),你必須意識到該查詢的每一次使用,並考慮這個附加數據是否需要用於該用例,或者可能導致性能問題,選擇檢索大量數據實際上並不需要。

+0

感謝您的觀點!很有用。 –

1

不幸的是,您的表結構中沒有這種方式來刪除mysql中的重複顏色。

雖然mysql提供了一種在使用連接時刪除重複的顏色的方法。如果您在表格中都有相同的顏色名稱,那麼您可以使用「使用」而不是「加入」。 「使用」刪除了額外的相同顏色。請參考以下網址獲取更多詳細信息: MySQL ON vs USING?

希望這會有所幫助!

+0

不錯,有幫助!下次我會記住這一點。不幸的是,對於其他關係表,我不能使用列'id'作爲'外鍵',因爲我期望'外鍵'會一遍又一遍地重複。我們的目標是實際移除結果集中的'user_id'列,同時避免查詢時間過長,因爲其中有30列。 –