Ben birine iki MySQL sorguları birleştirebilir miyim?

3 Cevap php

Ben aşağıdaki kod vardı

<?php

$getFriendQuery = "SELECT DISTINCT U.username FROM users as U INNER JOIN test_friends as F on U.Id = F.user_id WHERE F.friend_id = '{$userID}' && F.active=1";


$getFriendResult = mysql_query($getFriendQuery, $conn) or die (mysql_error());

$friendName = "";


while($getFriendFetch = mysql_fetch_assoc($getFriendResult)){
  $friendName .= $getFriendFetch['username'] . ", ";
}


$getFriendQuery  = "SELECT u.username FROM users u INNER JOIN test_friends f ON u.id = f.user_id WHERE (f.friend_id = '{$userID}' AND active=1) OR (f.user_id = '{$userID}' AND active=1)";

$getFriendResult = mysql_query($getFriendQuery, $conn) or die (mysql_error());


while($getFriendFetch = mysql_fetch_assoc($getFriendResult)){
  $friendName .= $getFriendFetch['username'] . ", ";
}


if (!empty($friendName)){
  echo "Your friends: " . $friendName ;
} else {
  echo "You do not have any friends yet";
  } 

?>

Benim kod "friends list" almak için 2 sorguları gerekir. 1 sorguyu çalıştırmak ve tüm arkadaş listesini alabilirsiniz bir yolu var mı?

Daha fazla bilgi:

Ben 2 tablolar var. "Users table" ve "test_friends" tablo. Kullanıcılar tablo vardır:

id temsıl eder user id => data type int(11)

username => data type varchar(256)

Test_friends tablosu vardır:

user_id temsıl eder user id => data type int(11)

friend_id => data type int(11)

active => tinyint

3 Cevap

Eğer biri hem sorguları yapmak için bir birlik yapmak gerekir. SQL bu gibi görünecektir:

SELECT U.username
FROM   users AS U
INNER JOIN test_friends AS F
ON     U.Id = F.user_id
WHERE  F.friend_id = '{$userID}'
AND    F.active = 1
UNION
SELECT u.username
FROM   users u
INNER JOIN test_friends f
ON     u.id = f.user_id
WHERE  ( f.friend_id = '{$userID}'
AND      active = 1 )
OR     ( f.user_id = '{$userID}'
AND      active = 1 )

Eğer sürü üzerinde DISTINCT dahil sanki o da, sizin için otomatik olarak çiftleri kaldıracaktır. (Bunu istemiyorsanız eğer "TÜM BİRLİĞİ" yapın.)

Ayrıca, sonuçlar sipariş etmek istiyorsanız, ucunda "1 ASC ORDER BY" ekleyin. Sadece sendikalar ile ORDER BY yan tümcesinde de sonuç kümesi sütun numaralarını kullanabilirsiniz.

Sütun sayısı ve türleri aynıdır her bir alt sorgu tarafından belirlenen sonuç döndü Birleşim sorguları sadece çalışır.

Aside: Your first query appears to be a subset of the second query, so you really only need to so the second query. I've left it as is as a demonstration of how to do unions, but you don't really need to in this case.

Siz iki sorgu arasında bir UNION yapabilirsiniz. Örneğin:

SELECT username FROM users WHERE username like '%billy%'
UNION 
SELECT username FROM users WHERE username like '%bob%'

billy veya bob gibi isimler ile tüm kullanıcıların dönecektir. Bir BİRLİĞİ ile yukarıdaki tüm iki sorguları birleştiren çalışması gerekir.

İlk sorgu ikinci sorgunun bir alt kümesi gibi görünen, yalnızca ikinci sorguyu yürütmek gerekir gerekir.

I-Test_Friends tabloda user_id alanı, kullanıcının kimliği temsil eder ve friend_id alanı, kullanıcının arkadaşının kimliği temsil varsayalım.

Bu durumda daha sonra sorgu yürütebilir:

SELECT DISTINCT U.username 
   FROM Test\_Friends F 
   INNER JOIN Users U ON F.friend\_id = U.user\_id 
WHERE 
   F.user\_id = '{$userID}' AND 
   F.active = 1