Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 20

0
votes
answers
12 views
+10

無法在我的查詢中集成INNER JOIN

2

您好,我正在使用以下查詢從每個唯一對話中選擇最新消息。除了當我嘗試集成INNER JOIN以嘗試在users表中鏈接用戶的user_id及其username時,所有內容都可以正常工作。無法在我的查詢中集成INNER JOIN

我已經嘗試過幾乎所有的組合來集成INNER JOIN,所以我決定將它從正在工作的查詢中分離出來,直到我獲得幫助。

我做了一個小提琴http://sqlfiddle.com/#!9/a9bbc/1我只想USER_ID右邊打印用戶的用戶名

SELECT message_id, 
     msg, 
     user_id 
FROM messages 
    JOIN (SELECT user_id, 
       Max(dat) m 
     FROM ((SELECT message_id, 
         recipient_id user_id, 
         dat 
        FROM messages 
        WHERE owner_id = 1) 
       UNION 
       (SELECT message_id, 
         owner_id user_id, 
         dat 
        FROM messages 
        WHERE recipient_id = 1)) t1 
     GROUP BY user_id) t2 
    ON ((owner_id = 1 
      AND recipient_id = user_id) 
      OR (owner_id = user_id 
       AND recipient_id = 1)) 
     AND (dat = m) 
ORDER BY dat DESC 

users.username INNER JOIN users ON messages.user_id = users.user_id; 
+0

whats users.username here -schemaname.tablename or tablename.column name? –

+0

tablename.column – Julian

+0

你應該使用連接與表,你在這裏做錯了。它應該是messages上的內部消息加入用戶.user_id = users.User_Id –

沙发
0
1

如果messages.message_idAUTO_INCREMENT PRIMARY KEY列,這將可能是能收到理想的結果的最快方法:

select m.message_id, m.msg, u.username, 
    case sub.other_user_id 
    when m.owner_id  then 'received from' 
    when m.recipient_id then 'sent to' 
    end as direction 
from (
    select other_user_id, max(message_id) as message_id 
    from (
    select recipient_id as other_user_id, max(message_id) as message_id 
    from messages 
    where owner_id = @uid 
    group by recipient_id 

    union all 

    select owner_id as other_user_id, max(message_id) as message_id 
    from messages 
    where recipient_id = @uid 
    group by owner_id 
) sub 
    group by other_user_id 
) sub 
join messages m on m.message_id = sub.message_id 
join users u on u.user_id = sub.other_user_id 
order by sub.message_id desc 

我我也添加了列direction。通過這種方式,您將知道該消息是否已發送或接收。其結果將是這樣的:

| message_id |                msg | username |  direction | 
|------------|------------------------------------------------------------------|----------|---------------| 
|   9 | You should also see this           | User3 |  sent to | 
|   8 | you should Now see this instead even with the owner_id flipped.. | User2 | received from | 

http://sqlfiddle.com/#!9/a9bbc/34

注意,您可以從usersmessages表的SELECT子句中仍然添加任何列。

爲了快速獲得此查詢,您需要索引messages(owner_id, recipient_id)messages(recipient_id, owner_id)

+0

非常優雅的解決方案 – Julian

+0

2發送到3(不工作):[小提琴](http:// sqlfiddle .com /#!9/0858dd/1) – Zorkolot

+1

@Zorkolot如果User2向User3發送消息,他們(通常)不希望User1看到它:-)請注意'@ uid'必須由'正在發送請求的用戶的user_id。在這種情況下,它是User1的'user_id = 1'。我們只希望看到發送或接收來自該用戶的消息。 –

板凳
0
0

當你加入任何表或子查詢時,你確實需要在所有列引用中包含表名或表別名。我把最大的dat改爲maxdat,所以我可以用m來表示消息。

SELECT 
     m.message_id 
    , m.msg 
    , m.user_id 
FROM messages m 
JOIN (
     SELECT 
      user_id 
      , MAX(dat) maxdat 
     FROM (
      (SELECT 
        message_id 
       , recipient_id user_id 
       , dat 
      FROM messages 
      WHERE owner_id = 1) 
      UNION 
      (SELECT 
        message_id 
       , owner_id user_id 
       , dat 
      FROM messages 
      WHERE recipient_id = 1) 
    ) t1 
     GROUP BY 
      user_id 
) t2 ON (
     (m.owner_id = 1 AND m.recipient_id = t2.user_id) 
     OR (m.owner_id = t2.user_id AND m.recipient_id = 1) 
     ) 
     AND (m.dat = t2.maxdat) 
ORDER BY 
     m.dat DESC 
地板
0
0

如果我理解正確,您需要發送或接收者爲「1」和關聯用戶名的最新消息。

這表明:

select m.*, ur.username as recipient_name, us.username as sender_name 
from messages m join 
    users ur 
    on m.recipient_id = ur.user_id join 
    users us 
    on m.sender_id = us.user_id 
where m.date = (select max(m2.dat) 
       from messages m2 
       where 1 in (m2.recipient_id, m2.sender_id) 
       ) and 
     1 in (m.recipient_id, m.sender_id); 

編輯:

你的SQL小提琴基於上述認識是不正確的。你要考慮對受助人的,所以我想你想:

select m.*, ur.username as recipient_name, us.username as sender_name 
from messages m left join 
    users ur 
    on m.recipient_id = ur.user_id left join 
    users us 
    on m.owner_id = us.user_id 
where m.dat = (select max(m2.dat) 
       from messages m2 
       where (m2.recipient_id, m2.owner_id) = (m.recipient_id, m.owner_id) or 
        (m2.recipient_id, m2.owner_id) = (m.owner_id, m.recipient_id) 
      ) and 
     1 in (m.recipient_id, m.owner_id); 

Here是SQL小提琴。

如果對的排序是進口(因此(1, 2)(2, 1)不同去除最裏面where子句中的第二個條件。

+0

謝謝你的回覆,很遺憾我在'字段列表'中有'未知列'ur.name'的錯誤,我在編輯中添加了一些示例數據。 – Julian

+0

嘗試你的新編輯,但仍然無濟於事...我做了一個小提琴[鏈接](http://sqlfiddle.com/#!9/14498d/2)我只想用戶名,而不是他們的user_id – Julian

4楼
0
0

你需要與用戶表加入您的最終結果,並得到用戶的價值。基於USER_ID用戶名試試這個:。

SELECT messages.message_id, 
    messages.msg, 
    users.user_id, 
    users.username 
FROM users, messages 
    JOIN (SELECT user_id, 
      Max(dat) m 
    FROM ((SELECT message_id, 
        users.username, 
        recipient_id user_id, 
        dat 
       FROM messages 
       INNER JOIN users ON messages.recipient_id = users.user_id 
       WHERE owner_id = 1) 
      UNION 
      (SELECT message_id, 
        users.username, 
        owner_id user_id, 
        dat 
       FROM messages 
       INNER JOIN users ON messages.owner_id = users.user_id 
       WHERE recipient_id = 1)) t1 
    GROUP BY user_id) t2 
ON ((owner_id = 1 
     AND recipient_id = user_id) 
     OR (owner_id = user_id 
      AND recipient_id = 1)) 
    AND (dat = m) 
WHERE users.user_id = messages.user_id 
ORDER BY dat DESC 
+0

謝謝你你的迴應,但我得到了這個錯誤'未知列'messages.user_id'在'where子句'' – Julian

5楼
0
1

我認爲這是正確的......終於沒有開始後,存在過濾掉反應..內部查詢抓住最近的談話這應該符合預期輸出。

SELECT dT.maxid AS message_id 
     ,(SELECT msg FROM messages M WHERE M.message_id = dT.maxid) AS message_id 
     ,(SELECT username FROM users U WHERE U.user_id = dT.owner_id) AS user_id  
    FROM ( 
     SELECT MAX(message_id) as maxid 
       ,owner_id 
       ,recipient_id 
      FROM messages M 
     GROUP BY owner_id, recipient_id 
     ) AS dT 
WHERE NOT EXISTS(SELECT * 
        FROM messages M2 
        WHERE M2.recipient_id = dT.owner_id 
        AND M2.owner_id = dT.recipient_id 
        AND M2.message_id > dT.maxid) 
ORDER BY dT.maxid   

生成輸出:

message_id message_id            user_id 
8   you should Now see this instead even with the   User2 
      owner_id flipped.. The users_id in the query is 1 
      and it gets the conversation with user_id 2 
9   You should also see this        User1 

fiddle

+0

謝謝你的迴應,我做了一個[小提琴](http://sqlfiddle.com/#!9/93e120/ 1)...我想要的是'user_id'在右側打印用戶名' – Julian

+0

@Julian這可能是[小提琴](http://sqlfiddle.com/#!9/5ed6e8/3/ 0) – Zorkolot

+0

我剛剛意識到你的解決方案打印出正確的答案,但不是我正在尋找的東西。我更新了我正在尋找的[fiddle](http://sqlfiddle.com/#!9/a9bbc/1)...我需要它在對話中顯示最重新發送的消息,而不管'owner_id ''或'recipient_id'查詢中的user_id是'1',因此它會在每次對話中得到最新消息。再次感謝 – Julian

0
votes
answers
41 views
+10

mysql命令由品牌查詢慢解決了,但是不知道爲什麼

2

我有以下查詢:mysql命令由品牌查詢慢解決了,但是不知道爲什麼

select * 
from 
    `twitter_posts` 
where 
    `main_handle_id` in (
    select 
     `twitter`.`main_handle_id` 
    from 
     `users` 
     inner join `twitter` on `twitter`.`user_id` = `user`.`id` 
    where 
     `users` LIKE 'foo' 
) 
order by created_at 

當使用順序由該查詢運行顯着變慢。 twitter_posts表的索引位於created_at時間戳和main_handle_id列。

我用「解釋」來看引擎正在計劃做什麼,並注意到一個文件夾......我不期望看到這個文件夾作爲索引存在於twitter_posts表中。在瀏覽覆蓋Stackoverflow和博客上的各種帖子後,沒有任何示例適用於我。我有一種預感,也許,sql優化器與嵌套選擇有些混淆。所以我包裹查詢,並通過created_at下令的結果:

select * (select * 
from 
    `twitter_posts` 
where 
    `main_handle_id` in (
    select 
     `twitter`.`main_handle_id` 
    from 
     `users` 
     inner join `twitter` on `twitter`.`user_id` = `user`.`id` 
    where 
     `users` LIKE 'foo' 
) 
) 
order by created_at 

使用這一個解釋,是否使用索引進行排序,並返回在它與文件排序需要一小部分的響應。所以我「解決了」我的問題,但我不明白爲什麼SQL會根據解決方案做出不同的選擇。據我所知,我只是包裝的結果,並要求一切看起來多餘的聲明...

編輯:我仍然不知道爲什麼優化器開始使用created_at上的索引當使用冗餘子查詢時,但在某些情況下不會更快。我現在用解決方案來添加語句「FORCE INDEX FOR ORDER BY created_at_index_name」。

+0

您是否嘗試過使用強制索引? –

+0

我有,但是這也不起作用+這是一個骯髒的解決方案...雖然冗餘查詢也是如此:)所以我的問題不是如何優化這個解決方案。我的問題是爲什麼。我認爲答案很可能取決於我使用的MariaDB版本。我不知道MySQL和Maria之間有任何顯着的優化變化... –

+0

@PraveenE我已經更新了我的答案,使用冗餘選擇會導致在某些查詢中創建臨時表(取決於內部的位置聲明)也使其緩慢。 –

沙发
0
1

請勿使用IN (SELECT ...);將其轉換爲JOIN。或者也許轉換爲EXISTS (SELECT ...)可能會優化得更好。請致電EXPLAINs即使它們都是相同的。如果你的版本有這樣的話,請提供EXPLAIN FORMAT=JSON SELECT ...

如果優化器被嵌套查詢困惑,爲什麼要添加另一個嵌套?

哪個表是users

您提到user.id,但FROMJOIN中沒有user表。

你使用的是什麼版本的MySQL(或MariaDB)? 5.6,尤其是5.7在優化器方面與MariaDB相比具有顯着差異。

請爲查詢中提到的每個表提供SHOW CREATE TABLE

在您的評論中有提示,您提出的查詢不是給您帶來麻煩的提示。請不要詢問本身的問題

哦,是users.name?需要查看CREATE TABLEs以查看您是否有合適的索引。

由於MariaDB被提及,我添加了該標籤。 (這可能是獲得具體涉及MariaDB專業知識的人的唯一方法。)

0
votes
answers
8 views
+10

字符串中沒有足夠的參數,Python中的MySQL查詢中帶有列表值的多個IN子句

0

我有下面的代碼,一旦添加第二個IN子句以過濾姓氏,就無法使其工作。字符串中沒有足夠的參數,Python中的MySQL查詢中帶有列表值的多個IN子句

format_fname = ','.join(['%s'] * len(stFirstnames)) 
format_lname = ','.join(['%s'] * len(stLastnames)) 

curDox.execute("SELECT * FROM user WHERE firstname IN (%s) AND lastname IN (%s)" % format_fname, 
       tuple(stFirstnames), format_lname,tuple(stLastnames)) 

錯誤我得到的是

TypeError: not enough arguments for format string 
沙发
0
-1

按照MySQLCursor.execute() documentation,應該有查詢字符串參數之後逗號。例如,cursor.execute(select_stmt, { 'emp_no': 2 })

10
votes
answers
32 views
+10

How do I access my database level functions inside other classes/files in Tornado?

I'm new to Tornado, and I'm currently trying to get past this recent stumbling block. Currently I have some database variables defined, and I instantiate the handlers, settings, and database connection info when I init the Application class. I also have a base handler class (named BaseHandler) which provides a simple database interface to other classes. I'd like to split some of my classes into other files, and have most of my database logic in those other class methods, and keep application.py for the routes, and instantiating these other classes when needed, and passing the necessary data to them for the database. How would I access this self.db function from within these other files/classes?

application.py:

import tornado.database
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
from user import User

# Define some startup settings, can be changed through the command line
define("port", default=8888, help="Run on the given HTTP port", type=int)
define("db_host", default="localhost:3306", help="Database host")
define("db_name", default="database_name", help="Database name")
define("db_user", default="user", help="Database username")
define("db_pass", default="password", help="Database password")

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler)
        ]
        settings = dict(
            application_title = u"Test Application",
            template_path = os.path.join(os.path.dirname(__file__), "templates"),
            static_path = os.path.join(os.path.dirname(__file__), "static"),
            autoescape = None
        )
        tornado.web.Application.__init__(self, handlers, **settings)

        self.db = tornado.database.Connection(
            host=options.db_host, database=options.db_name,
            user=options.db_user, password=options.db_pass)

class BaseHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        return self.application.db

class MainHandler(BaseHandler):
    def get(self):
        u = User()
        self.write(tornado.escape.json_encode(u.get_user("test@test.com)))

user.py:

class User(object):
    def get_user(self, email):
        result = self.db.get("SELECT first_name, last_name FROM users WHERE email = %s", email)
        if not result: return False
        return True, result

This logic does work fine when I haven't separated the logic out to a separate file, so I'm clearly doing something wrong/missing something.

up vote 10 down vote accepted favorite
沙发
+100
+50

I meet the same situation just now, then I view some examples on github and made that.

I separate my files like:

  • server.py: run app
  • urls.py: define handers and ui_modules
  • da.py: define helpful methods for data access

Following are some brief of each file, I think this can help you to solve your problem.

urls.py

import main
import topic

handlers=[]
handlers.extend(main.handlers)
handlers.extend(topic.handlers)

ui_modules={}

da.py

import tornado.database

from tornado.options import define,options
define("mysql_host", default="127.0.0.1:3306", help="database host")
define("mysql_database", default="forum", help="database name")
define("mysql_user", default="root", help="database user")
define("mysql_password", default="111111", help="database password")

db = tornado.database.Connection(
    host=options.mysql_host, database=options.mysql_database,
    user=options.mysql_user, password=options.mysql_password)

server.py

import os
import tornado.database
import tornado.httpserver
import tornado.ioloop
import tornado.web

from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

import da

class Application(tornado.web.Application):
    def __init__(self):
        from urls import handlers,ui_modules
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
            cookie_secret="11oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
            login_url="/signin",
            ui_modules=ui_modules,
            debug=True,
        )
        super(Application,self).__init__(handlers,**settings)
#       tornado.web.Application.__init__(self, handlers, **settings)
        # Have one global connection to the blog DB across all handlers
        self.db = da.db

def runserver():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    runserver()

You can use db just 'from da import *' and then everything goes well, or you can write a BaseHandler extends tornado.web.RequestHandler and define a property:

class BaseHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        return self.application.db

Every handler that extends BaseHandler can use self.db to do database operations then.

真棒!感謝你推動正確的方向,我很感激。 - Zac Clancy 2012年4月8日17:01

:)。現在我在代碼中做了一些更改。我在da.py上定義db並在其中寫入數據訪問方法,例如GetKindById(self,id)。並且不需要在server.py中定義self.db,因為每次要使用db時,都可以從da.py導入它,或者調用GetKindById(self,id)等方法來訪問數據。 - goofansu 12年4月9日在5:54

重要的是要注意tornado.database在Tornado 2.4天期間被棄用,並被移出Tornado 3.0進入torndb,後者不再維護並且與Python 3不兼容 - Marc 8月24日'17 at 2:10

0
votes
answers
42 views
+10

如何使用searchview在自定義ArrayAdapter上實現搜索功能?

0

我是Android編程的初學者,我遇到了一個問題,我似乎無法找到解決方案。我搜索了幾個小時的stackoverflow,但我仍然不太清楚它應該怎麼做:如何使用searchview在自定義ArrayAdapter上實現搜索功能?

我創建了一個用php與本地xampp mysql服務器通信的slim api,並且我可以對它進行基本的CRUD操作。我從服務器獲取api的數據,它將數據庫中的所有「項目」返回給List,並且我可以在listView中使用它。每個列表項都有6個TextView,所以我創建了一個自定義的ArrayAdapter,但我不知道要搜索特定的列表項。

我的項目類:

public class Item { 

     private String mName; 
     private String mQuantity; 
     private String mDate_added; 
     private String mBarcode; 
     private String mPrice; 
     private String mWarranty; 
     private int mId; 

     public Item(String mName, String mQuantity, String mDate_added, String mBarcode, String mPrice, String mWarranty,int mId) { 
      this.mName = mName; 
      this.mQuantity = mQuantity; 
      this.mDate_added = mDate_added; 
      this.mBarcode = mBarcode; 
      this.mPrice = mPrice; 
      this.mWarranty = mWarranty; 
      this.mId = mId; 
     } 

     public int getmId(){return mId; } 

     public String getmName() { 
      return mName; 
     } 

     public String getmQuantity() { 
      return mQuantity; 
     } 

     public String getmDate_added() { 
      return mDate_added; 
     } 

     public String getmBarcode() { 
      return mBarcode; 
     } 

     public String getmPrice() { 
      return mPrice; 
     } 

     public String getmWarranty() { 
      return mWarranty; 
     } 
    } 

我的適配器

public class ItemAdapter extends ArrayAdapter<Item> { 


    public ItemAdapter(Context context, ArrayList<Item> items) { 
     super(context,0, items); 

    } 


    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     View ListItemView= convertView; 
     if (ListItemView == null) { 



      ListItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item,parent,false); 

      Item currentItem = getItem(position); 


      TextView nameText = (TextView) ListItemView.findViewById(R.id.name); 
      TextView quantityText = (TextView) ListItemView.findViewById(R.id.quantity); 
      TextView date_addedText = (TextView) ListItemView.findViewById(R.id.date_added); 
      TextView barcodeText = (TextView) ListItemView.findViewById(R.id.barcode); 
      TextView priceText = (TextView) ListItemView.findViewById(R.id.price); 
      TextView warrantyText = (TextView) ListItemView.findViewById(R.id.warranty); 


      nameText.setText(currentItem.getmName()); 
      quantityText.setText(currentItem.getmQuantity() +" e"); 
      date_addedText.setText(currentItem.getmDate_added()); 
      barcodeText.setText(currentItem.getmBarcode()); 
      priceText.setText(currentItem.getmPrice()+ " pr/e"); 
      warrantyText.setText(currentItem.getmWarranty()); 

     } 

     return ListItemView; 
    } 

} 

我得到HttpURLConnection的get方法的數據,我用一個AsyncTaskLoader這一點。這會將數據返回給定URL中的List。

public class ItemLoader extends AsyncTaskLoader<List<Item>> { 

    private String mUrl; 

    public ItemLoader(Context context, String url) { 
     super(context); 
     mUrl = url; 
    } 


    @Override 
    protected void onStartLoading() { 



     forceLoad(); 
    } 



    @Override 
    public List<Item> loadInBackground() { 


     if (mUrl == null) { 
      return null; 
     } 

     // Perform the network request, parse the response, and extract a list of items. 
     List<Item> items = QueryUtils.fetchItemData(mUrl); 
     return items; 
    } 

} 

接下來,在我的主要活動中,我實現了loader回調。

private ItemAdapter mAdapter; 

    @Override 
     public android.content.Loader<List<Item>> onCreateLoader(int i, Bundle bundle) { 

      return new ItemLoader(this,API_REQUEST_URL); 
     } 


    @Override 
     public void onLoadFinished(android.content.Loader<List<Item>> loader, List<Item> items) { 
      mAdapter.clear(); 

      if (items != null && !items.isEmpty()) { 


       mAdapter.addAll(items); 
      } 

     } 

@Override 
    public void onLoaderReset(android.content.Loader<List<Item>> loader) { 
     Log.e("init loader","Log"); 

     mAdapter.clear(); 
    } 

在的onCreate

android.app.LoaderManager loaderManager = getLoaderManager(); 
      loaderManager.initLoader(0, null, MainActivity.this); 

listView.setAdapter(mAdapter); 

我要搜索項目的名稱,並返回相應的在ListView。我創建了其與setOnQueryTextListener搜索視圖:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main,menu); 

     SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); 
     search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); 

     search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String s) { 


       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String s) { 

       return false; 
      } 

     }); 

     return true; 
    } 

AAAND ......現在我有點卡住了。我知道我應該在適配器類上實現'Filterable',重寫一些方法,創建一個過濾器等,如果我有一個硬編碼List,我只需要更改它就不那麼困難,但是這些網絡請求,後臺線程,從服務器獲取數據讓我感到困惑,所以我不知道該怎麼做。

Halp! :c

沙发
0
0

您可以在適配器中覆蓋getFilter()方法,並返回根據輸入過濾數據集的Filter實現。

而在你的搜索回調可以調用

adapter.getFilter().filter(queryString); 

Here's an example

+0

接受答案,如果它幫助 – elmorabea

板凳
0
0

它沒有那麼多困難。從你的代碼中,我可以說你在你的活動中使用Loaders獲取數據。裝載機將把這些數據提供給適配器。

活動 - >裝載機 - >獲取數據 - >傳遞給適配器 - >在列表

顯示數據所以,如果你想實現過濾可以實現,並從可用列表中得到過濾後的數據了。如果您提供所有數據搜索或篩選,則可以再次調用加載程序以從數據庫或Web服務獲取數據,然後使用適配器中的新數據顯示數據。

0
votes
answers
43 views
+10

MySQL在同一個表結合不同的計數()

1

我的數據庫擁有「LASTONLINE」時間戳變量時,在用戶登錄,我想用這個以檢索3個值MySQL在同一個表結合不同的計數()

即獲得更新
[The total amount of users][users online today][users online in the last hour]. 

我能做的每一聲明seperately

SELECT count(u.id) AS usersTotal FROM user u 

SELECT count(u.id) AS usersDay FROM user u 
WHERE u.lastOnline >= now() - INTERVAL 1 DAY 

SELECT count(u.id) AS usersHour FROM user u 
WHERE u.lastOnline >= now() - INTERVAL 1 HOUR 

,但我有麻煩加盟/聯合他們的3成一個查詢

謝謝

沙发
0
1

你可以使用:

SELECT count(u.id) AS usersTotal 
     ,SUM(u.lastOnline >= now() - INTERVAL 1 DAY) AS usersDay 
     ,SUM(u.lastOnline >= now() - INTERVAL 1 HOUR) AS usersHour 
FROM user u; 

工作原理:

u.lastOnline >= now() - INTERVAL 1 DAY回真(1)或假(0)。

+1

完美...非常感謝! – Rik1988

+0

在標記上有十分鐘回答,再次感謝您的快速回復 – Rik1988

0
votes
answers
17 views
+10

得到所有用戶誰沒有關注用戶2

0

例子:我想誰不遵循ID 2用戶得到所有用戶誰沒有關注用戶2

表關注

id  | user_id | follower_id 

    1   2    7 
    2   2    8 

表用戶的所有用戶

id | username | e-mail | group 
+1

你不應該詳細的語言你所期望的答案:SQL或PHP方式。 – srodriguex

沙发
0
0

給這一個鏡頭:

Select users.* 
from users 
where users.id not in (
    select followers.follower_id 
    from followers 
    where followers.user_id = "2" 
) 
+0

謝謝,完美工作! –

+0

請接受這個答案作爲正確的答案。謝謝。 – RLessard

板凳
0
0

我不是一個mysql專家,但我相信一個僞sql將是:

select users.* from users where users.id is in (select distinct follower_id from followers where followers.user_id != 2) 

!=意味着不同

+0

結果返回多個用戶重複 https://image.prntscr.com/image/T-iRabAaQg_9Jzshg02luQ.png –

+0

我已經改變了僞sql。 – srodriguex

+0

您可以使用** distinct **刪除重複項。 – srodriguex

0
votes
answers
19 views
+10

如何使用jQuery在聊天中檢查消息狀態「消息可見」

0

我有一個使用PHP,mySQL和jQuery創建的聊天應用程序。它對我來說工作得很好。但是現在我想在接收者看到消息時添加「消息可見」功能。或者它可以像在WhatsApp中做的那樣是一個「勾號」功能。問題是我不知道如何做到這一點。如何使用jQuery在聊天中檢查消息狀態「消息可見」

下面是僅用於在用戶之間發送和接收消息的腳本。我需要做什麼來實現這一點?

$ = jQuery; 
var currentID = null; 
var chatTimer = null; 
var oldhtml = ""; 

function fetch_data() { 
    $.ajax({ 
    url: "select.php", 
    method: "POST", 
    success: function(data) { 
     $('#live_data').html(data); 
    } 
    }); 
} 

function fetch_chat() { 
    $.ajax({ 
    url: "fetch_chat.php", 
    method: "POST", 
    data: { 
     id: currentID 
    }, 
    dataType: "text", 
    success: function(data) { 
     $("#chatbox").show(); 
     $('#messages').html(data); 
     $("div.area").show(); 
     if (oldhtml !== data) { 
     $('#messages').scrollTop($('#messages')[0].scrollHeight); 
     } 
     oldhtml = data; 
    } 
    }); 
} 

$(document).ready(function() { 
    fetch_data(); 

    setInterval(function() { 
    fetch_chat(); 
    }, 500); 

    $(document).on('click', '.first_name', function() { 
    currentID = $(this).data("id1"); 
    fetch_chat(); 
    }); 

    $("#sub").click(function() { 
    var text = $("#text").val(); 
    $.post('insert_chat.php', { 
     id: currentID, 
     msg: text 
    }, function(data) { 
     $("#messages").append(data); 
     $("#text").val(''); 
    }); 
    }); 
}); 
+0

目前尚不清楚「看到」的定義是什麼查看此處查看如何檢查某些內容在視口中可見https://www.google.nl/search?q=jquery+is+visible+in+ viewport – mplungjan

+0

當接收者查看接收到的MessAge時,看到的意思是「看到」應顯示給發件人 –

+0

您需要詳細說明您的數據模型...例如這個問題,因爲它目前是太寬泛IMO – abigperson

沙发
0
0

你需要一個標誌在您的訊息表, 當接收器獲取一些信息,這些信息的狀態應設置爲「可見」,或者,如果你願意,你可以使用Ajax調用做到這一點後,該接收者打開聊天框或發生任何事件(如接收者點擊聊天框)。 在聊天框中,您必須爲每條消息設置id,並且每次您檢索消息或檢查新消息時,還必須檢查「unseen」消息並在消息旁邊發送消息狀態,並且使用javascript,必須更改類這些消息的「看不見」和其他消息「看到」

板凳
0
0

我假設消息被「看到」它必須是可見的聊天的HTML節點($(「#消息」)在你的情況) ,這意味着某種原因它可以被隱藏(例如:另一個聊天html節點「活動」,如果有幾個,並且只有一個可以一次處於活動狀態,或者瀏覽器標籤失焦,或者甚至消息不在聊天html節點的滾動視圖...)。因此,爲什麼不只是添加事件監聽器,監聽它是否獲取「活動」狀態或瀏覽器選項卡焦點......當條件滿足時,只需執行一個ajax查詢來改變狀態(接收到的,閱讀(在這種情況下)...)數據庫中的消息的ID(假設每個消息都有一個唯一的ID集)。當然,應該有一個定時器retreiving消息的狀態,屆時,在發送方,你選擇閱讀消息的ID和設法讓他們「打勾」的意願,甚至做別的事情。

+0

你可以提供的代碼。如果可能的話 –

0
votes
answers
46 views
+10

如何獲取登錄用戶不是MySQL中的所有用戶?

3

我完全能夠得到所有的登錄用戶當前的朋友,這是我此查詢這裏做 -如何獲取登錄用戶不是MySQL中的所有用戶?

SELECT users.* 
FROM users 
LEFT JOIN friends 
ON users.id = friends.friend_id 
WHERE friends.user_id = $user_logged_in_id 

但我想要做的相反,我也搞不清楚。

我想要做朋友的邏輯。

我需要得到所有誰是當前登錄用戶的用戶尚未朋友

我有一個用戶表和朋友表作爲一個多用戶和他們的朋友之間一對多的關係。 friends表中的鍵是user_id friend_id。

爲了說明某人是我與其他用戶的朋友(說登錄的用戶ID是3,朋友的用戶ID是6)user_id = 3friend_id = 6作爲一行,然後把另一行與ID的翻轉來說明友誼的另一種方式,user_id = 6friend_id = 3

用戶表

|---------------------|------------------| 
|   id   |  username  | 
|---------------------|------------------| 
|   1   |  sonja12  | 
|---------------------|------------------| 
|   2   |  dorris32  | 
|---------------------|------------------| 
|   3   |  billy32  | 
|---------------------|------------------| 
|   4   |  micha97  | 
|---------------------|------------------| 
|   5   |  travis841 | 
|---------------------|------------------| 
|   6   |  johnny28  | 
|---------------------|------------------| 

朋友表

|---------------------|------------------|------------------| 
|   id   |  user_id  |  friend_id | 
|---------------------|------------------|------------------| 
|   1   |  3   |   6  | 
|---------------------|------------------|------------------| 
|   2   |  6   |   3  | 
|---------------------|------------------|------------------| 

編輯:

我想我已經縮小我的問題有點更簡潔。

我想從用戶表中獲取所有用戶,其中他們的ID不會顯示爲朋友表中當前登錄用戶的user_id旁邊的朋友ID。

+1

更具體。現在看起來像'... WHERE friends.user_id!= $ user_logged_in_id「'會修復它,但我假設,這沒有奏效? – SourceOverflow

+0

不,返回除登錄用戶以外的所有人,並且它返回用戶登錄的用戶已經是朋友的兩倍 我希望能夠看到登錄用戶不是朋友的列表,以便他們可以輕鬆點擊「添加朋友按鈕」並添加新朋友。返回所有用戶並排除那些已經登錄的用戶已經是朋友,但我覺得像普通的sql會是一個更好的方式去這樣的事情。 –

沙发
0
2

您以奇怪的方式思考問題。這可能有助於將其視爲需要創建的集合的交集,而不是缺少id的集合。

SELECT id from users WHERE id != $logged_in_user AND id NOT IN (SELECT friend_id from friends where user_id=$logged_in_user)

+1

小心:'NOT IN(SELECT ...)'是非常可怕的在MySQL中緩慢 –

+0

@RickJames你知道比'NOT IN'更好的方式來完成任務嗎?我肯定對它開放。我現在看到其他答案,但不確定它們中的任何一個是否會我想我可以測試他們所有的並記錄執行時間。我的替代方案更慢,因爲我之前返回了整個列表,然後在每個用戶的循環中運行另一個單獨的查詢,以將它們從php中的數組中刪除,如果它們已經是朋友8 –

+1

'NOT EXISTS(SELECT 1 ... )' - 只評估直到它得到答案,而不是建立整個列表。或者'LEFT JOIN ... ON ... WHERE .. IS NULL' - 有時候類似的代碼。複合INDEX(user_id,friend_id)'會有很大的幫助。 –

板凳
0
0

SQL

SELECT u.* 
FROM usrs u 
LEFT JOIN friends f 
ON u.id = f.friend_id 
GROUP BY u.id, u.username, IF(f.user_id = $user_logged_in_id, 1, 0) 
HAVING MAX(IF(f.user_id = $user_logged_in_id, 1, 0)) = 0; 

演示

http://rextester.com/ELXFZ39682

說明

該查詢是基於您的原始數據,但是按每個用戶ID進行分組,因此不會返回重複項。爲了返回那些不是登錄用戶的好友,IF(f.user_id = $user_logged_in_id, 1, 0)將生成的列添加到設置爲1的組,如果該行是登錄用戶的好友,否則爲0.然後,我們可以使用HAVING MAX(...) = 0限制爲沒有行是朋友的組。

地板
0
1

對於更大的數據集,我會用一個NOT EXISTS子查詢的查詢:

select u.* 
from users u 
where u.id <> $user_logged_in_id 
    and not exists (
    select * 
    from friends f 
    where f.user_id = $user_logged_in_id 
     and f.friend_id = u.id 
) 

或LEFT(反)JOIN:

select u.* 
from users u 
left join friends f 
    on f.user_id = $user_logged_in_id 
    and f.friend_id = u.id 
where u.id <> $user_logged_in_id 
    and f.friend_id is null 

我認爲這兩個查詢執行計劃應該是差不多的相同。

演示:http://rextester.com/KUOZ9198

4楼
0
0
SELECT DISTINCT users.id, users.username 
    FROM users 
     LEFT OUTER JOIN friends 
    ON (friends.user_id = $user_logged_in_id and friends.friend_id = users.id) 
WHERE users.id <> $user_logged_in_id 
    AND friends.friend_id is null; 

該查詢可能會比NOT IN子查詢,如果用戶預計將有很多的朋友更好的性能。如果不是在子查詢執行相同,如果不是更好。

請注意DISTINCT。你需要這個,因爲這種關係是多對多的。

0
votes
answers
26 views
+10

從while循環顯示數據到html代碼

1

我需要提示或指導如何使用echo顯示來自mysql的數據。但我想在html代碼中顯示它。我想在mysql中顯示第一個標題的$row["title"]而不是title1$row["content"]而不是content1,並對所有3個div執行此操作。 php代碼正常工作我只是無法弄清楚如何做到這一點。從while循環顯示數據到html代碼

<div class="carousel-inner" style="background-size:cover;"> 
<div class="item active"> 
    <img src="img/road1.jpg"> 
    <div class="carousel-caption d-none d-md-block"> 
     <h2>title1</h2> 
     <p>content1</p> 
    </div> 
</div> 

<div class="item"> 
    <img src="img/road2.jpg"> 
    <div class="carousel-caption d-none d-md-block"> 
     <h2>title2</h2> 
     <p>content2</p> 
    </div> 
</div> 

<div class="item"> 
    <img src="img/road3.jpg"> 
    <div class="carousel-caption d-none d-md-block"> 
     <h2>title3</h2> 
     <p>content3</p> 
    </div> 
</div>--> 

<?php 
session_start(); 
include_once("db.php"); 

$sql = "SELECT * FROM news"; 
$query = mysqli_query($conn, $sql); 

if (mysqli_num_rows($query) > 0) { 

    while($row = mysqli_fetch_assoc($query)) { 
     echo "<h2>" . $row["title"] . "</h2>"; 
     echo "<p>" . $row["content"] . "</p>"; 
    } 
} else { 
    echo "0 results"; 
} 
?> 
+0

而且你也希望圖像在所有三個'div'中都不同。 –

+1

注意:'mysqli'的面向對象的接口明顯較少,使得代碼更易於閱讀和審計,並且不容易與已過時的'mysql_query'接口混淆。在你過於投入程序風格之前,它是值得轉換的。例如:'$ db = new mysqli(...)'和'$ db-> prepare(「...」)過程接口是PHP4時代的一個神器,當引入mysqli API時,不應該在新的碼。 – tadman

+1

我會嘗試自己做圖片,因爲如果我沒有錯,它會應用相同的邏輯。 @tadman感謝您的建議,我會研究它。 – mb164

沙发
0
0

你幾乎沒有。只需將html移入while循環的回顯即可。

echo '<div class="carousel-inner" style="background-size:cover;">'; 

$counter = 1; 
while($row = mysqli_fetch_assoc($query)) { 
    echo ' 
    <div class="item ' . ($counter == 1 ? 'active' : '') . '"> 
     <img src="img/road{$counter}.jpg"> 
     <div class="carousel-caption d-none d-md-block"> 
      <h2>' . $row["title"] . '</h2> 
      <p>' . $row["content"] . '</p> 
     </div> 
    </div>'; 
    $counter++; 
} 
echo '</div>'; 

唯一的問題是圖像,逼真你保存圖像與標題和內容數據庫,然後用同樣的方法但是對於這個簡單的例子讓剛剛使用計數器

+1

謝謝。在我的代碼中做了一些編輯,並且像魅力一樣工作 – mb164

+0

很高興工作:) – Matt

板凳
0
0

請注意我改變你的整個代碼一點點地使所期望的結果...

<div class="carousel-inner" style="background-size:cover;"> 

<?php 
session_start(); 
include_once("db.php"); 

$sql = "SELECT * FROM news"; 
$query = mysqli_query($conn, $sql); 

if (mysqli_num_rows($query) > 0) { 

    while($row = mysqli_fetch_assoc($query)) { ?> 

     <div class="item active"> 
      <img src="img/road1.jpg"> 
      <div class="carousel-caption d-none d-md-block"> 
       <h2><?php echo $row["title"]; ?></h2> 
       <p><?php echo $row["content"]; ?></p> 
      </div> 
     </div> 


<?php 
    } 
} else { 
    echo "0 results"; 
} 
?> 

另外請注意,我只是重複第一個圖像...你需要規劃一個額外的,以確定如何處理圖像在代碼中,然後更新這一個。