0

「二重プロファイル」が一緒にある場合にのみ、ユーザー名から2つのユーザーレコードを取得するためのクエリを実行する方法を見つけようとしています。

私のテーブルは次のようになります。

doubles =>
  id
  user_1
  user_2
  profile_text

users =>
  id
  username
  url_username
  birthdate
  and so on

doubles テーブルにこのレコードがあるとします。

id    user_1    user_2         profile_text
5       14        16      Welcome to our profile

ユーザーテーブルにこれらの2つのレコードがあるとします(他の多くのレコードとともに):

id   username   url_username   birthdate
14    John         john        1990-05-09
16     Bob          bob        1991-07-04

ユーザーが www.mysite.com/double/john/bob にアクセスしたときに、2 人のユーザーを取得したいのですが、そのユーザーが doubles テーブルにレコードを持っている場合のみです (ユーザーの ID が user_1 か user_2 かに関係なく)。url_username は、URL に入力されたものです (この列の理由は、URL に置き換えられるデンマーク文字があるためです)。これを URL から取得します。

これは可能ですか?

編集:テーブル構造を変更することでより効率的にできる場合は、それで問題ありません。

4

1 に答える 1

1

テストするためにテーブルを作成しませんでしたが、このクエリは機能するはずです。

select * from users, doubles where (doubles.user_1 = users.id or doubles.user_2 = users.id) and users.url_username = 'THEUSERNAME';
URL を解析する方法が既にあると仮定して、where 句で url_username を使用しました。ただし、実際のユーザー ID のいずれかを使用する方がよいと思います。

わかりました、これはあなたが望むものを達成すると思う結合を使用したクエリです。(結合はサブクエリよりも高速であり、可能であれば推奨されます。)

これがどれくらい速いかについては、テストする必要があります。それは明らかに、見ているレコードの数に依存します。このクエリは、SQL インジェクションから保護するために何もしていないことに注意してください。(URLにあるものを使用しているだけですが、データベースに渡す前に安全であることを確認する必要があります。)

select 
  d.* 
from 
  users u1, 
  doubles d, 
  users u2 
where 
  (
    (d.user_1 = u1.id and d.user_2 = u2.id)
   or
    (d.user_1 = u2.id and d.user_2 = u1.id)
  )
and 
  (u1.url_username = 'john' and u2.url_username='bob');
試してみたい場合、またはデータベースが正しいことを確認する場合は、ここで SQL フィドルを作成しました。 http://sqlfiddle.com/#!2/a5acc/12

于 2013-04-24T15:23:26.663 に答える