iT邦幫忙

0

sql語法該如何下,求救!!

  • 分享至 

  • xImage

不是作業也不是工作

最近在寫php網頁
打算用來當工作日誌用

遇到一個問題如下

當我的帳戶是user2做登入時
可以看見4筆資料
當我的帳戶是user1做登入時
只看得到1、2、4筆資料

我sql該如何下??

附加條件:登入網頁會有session(自已想到是用session去判斷sql語法)
帳戶不止2個人、類別不止2種(所以不能只針對這二種寫)

看更多先前的討論...收起先前的討論...
既然類別不止2種,那是會有幾種? Public/Private and ??
帳戶不只兩個,你要不要先舉例,或是帳戶先分層級?

看你上面的例子是 user2 不管 公開/私人 都能看.
user1 是 看不到 user2 私人的.
可是你又說不只兩種類別,那第3種類別的對應行為,
你確尚未定義.
這樣子未定義是要怎樣寫呢?
這樣子是發散型的,無法收斂.
建議你先把你想作的東西,描述一下,另外日期資料,資料庫現成有日期型態,
用 820 / 1010 這樣子存,以後要處理,會很不方便的.
ghost234 iT邦新手 4 級 ‧ 2012-09-13 16:24:40 檢舉
不好意思
我將問題簡化太多了

原問題是

種類有如下
公司資料
公司待處理資料
購買保固
每月提醒
私人資料

因為種類在網頁中,我有給新增修改功能
所以才會說,不止二種(意思就是看使用者自訂)

重點在於
帳戶a登入後
只能看到a帳戶私人資料與其它類別資料
帳戶b登入後
只能看到b帳戶私人資料與其它類別資料
當我的帳戶是user2做登入時
可以看見4筆資料 <-- 請問這還成立嗎??
ghost234 iT邦新手 4 級 ‧ 2012-09-13 16:36:56 檢舉
不懂你的意思???

如果是以我舉的例子來說
當user2登入網頁後
是能看見4筆資料
因為編號3私人類別是屬於user2的
因為最早看你描述時,說user2可以看見4筆,就是全部,所以思維想成 user2
是 super user, 就是不管任何人任何類別 的方向去了.
現在看來你是 以 私人 以外都是公開,是這樣嗎?
ghost234 iT邦新手 4 級 ‧ 2012-09-14 08:15:58 檢舉
是的!!

我寫的網頁主要是當日誌用
所以除了私人看不到外

其它類別都要讓user查尋得到資料
所以是公開類
easonjuan iT邦研究生 1 級 ‧ 2012-09-14 16:32:51 檢舉
那如果再開個table來記誰可以看哪些類別呢?
這樣應該會比較簡單吧 ^ ^v
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
ge33
iT邦新手 5 級 ‧ 2012-09-13 16:50:53
最佳解答

select * from Table
where pname='帳號' or pp not in ('私人')

wiseguy iT邦超人 1 級 ‧ 2012-09-13 17:44:52 檢舉

如果樓主的需求,不給別人看的類,只有 '私人',那這樣寫倒是挺簡單的,不管以後還會再生出什麼類出來,直接不等於 '私人' 就好了。

&lt;pre class="c" name="code">select * from Table
where pname='帳號' or pp != '私人'
ghost234 iT邦新手 4 級 ‧ 2012-09-14 17:33:42 檢舉

select * from Table
where pname='帳號' or pp not in ('私人')
測試可用!!
結果等同於
select * from Table
where pname='帳號' or pp != '私人'

以時間上來說ge33先

10
wiseguy
iT邦超人 1 級 ‧ 2012-09-13 16:09:42

你的需求應該是:

  1. 自己才能看到自己的私人類

  2. 不是自己的,就看要挑什麼類 (你說不止兩種類)
    所以 SQL 是:

    <pre class="c" name="code">select * from TABLE
    where pname='帳號' or pp in ('公開','其它類1','其它類2')

ghost234 iT邦新手 4 級 ‧ 2012-09-13 16:34:01 檢舉

^^|
不行
因為sql是寫死在網頁中
但類別可以變動(除了公開與私人不能動外)

所以換句話說
當我的種類有4種
公開、私人、公司資料、其它資料時
除了公開與私人是不能修改之外
公司資料與其它資料被修改的話
sql語法無法運作

這就是我SQL語法傷腦筋的地方
感覺要用排除法.....

ghost234 iT邦新手 4 級 ‧ 2012-09-13 16:39:30 檢舉

剛想想想
想到,硬是要用此語法也是可以

先列出全部類別
丟入列陣變數中
再與sql結合

如果真的沒其它方法的話.......

wiseguy iT邦超人 1 級 ‧ 2012-09-13 21:36:24 檢舉

那就是改成

&lt;pre class="c" name="code">select * from Table  
where pname='帳號' or pp != '私人'

醬子,就不用怕公司資料與其它資料被修改了。

4
一級屠豬士
iT邦大師 1 級 ‧ 2012-09-13 16:50:09
&lt;pre class="c" name="code">
-- 我先以每個user能看到自己私人的,其餘公開等類型都能看,
-- 看不到別人私人的.不知這樣是不是你想要的.

CREATE TABLE ithelp0913 (
pid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ptitle VARCHAR(20) NOT NULL,
pdate DATE NOT NULL,
pname VARCHAR(10) NOT NULL,
pp VARCHAR(20) NOT NULL);

INSERT INTO ithelp0913(ptitle, pdate, pname, pp) VALUES
('修電腦','2010/8/20', 'user1', '公開'),
('朋友吃飯', '2012/9/30', 'user1', '公開'),
('買車', '2012/10/10', 'user2', '私人'),
('到台北', '2012/11/11', 'user2', '公開');

-- 假設登入為 user1
SET @myname := 'user1';

SELECT *
FROM ithelp0913
WHERE pp != '私人'
UNION ALL
SELECT *
FROM ithelp0913
WHERE pp = '私人'
AND pname = @myname;
+-----+--------------+------------+-------+--------+
| pid | ptitle       | pdate      | pname | pp     |
+-----+--------------+------------+-------+--------+
|   1 | 修電腦       | 2010-08-20 | user1 | 公開   |
|   2 | 朋友吃飯     | 2012-09-30 | user1 | 公開   |
|   4 | 到台北       | 2012-11-11 | user2 | 公開   |
+-----+--------------+------------+-------+--------+

-- 假設登入為 user2
SET @myname := 'user2';
+-----+--------------+------------+-------+--------+
| pid | ptitle       | pdate      | pname | pp     |
+-----+--------------+------------+-------+--------+
|   1 | 修電腦       | 2010-08-20 | user1 | 公開   |
|   2 | 朋友吃飯     | 2012-09-30 | user1 | 公開   |
|   4 | 到台北       | 2012-11-11 | user2 | 公開   |
|   3 | 買車         | 2012-10-10 | user2 | 私人   |
+-----+--------------+------------+-------+--------+

我要發表回答

立即登入回答