簡體   English   中英

在多行上滿足多個條件的MYSQL匹配條目

[英]MYSQL Match Entries that Meet Multiple Criteria over Multiple Rows

我認為這對於很多使用MYSQL的人來說是個簡單的選擇,但我只是不太了解...主要是因為不知道要搜索的術語是否正確。

基本上,我有一個將標簽ID映射到照片ID的表格,稱為tag_map。 當我執行此查詢時:

SELECT * FROM tag_map WHERE tag_id='1' OR tag_id='5';

我得到以下結果:

ph_id   tag_id
1       1
2       1
5       1
7       5
8       1
9       5
10      5
11      1
12      1
13      1

但是我真正想要的是僅選擇同時具有tag_id為'1'和'5'的ph_id。

因此,您可能會看到,我正在嘗試根據多個標簽過濾選擇。 我要結束於:

ph_id   tag_id
7       1
7       5
8       1
8       5
11      1
11      5

因此ph_id 7、8和11引用了tag_id 1和5。

希望有道理。

謝謝。

由於查詢的動態性質(用戶選擇任意數量的可用標簽以“縮小選擇范圍”),我采用了PHP解決方案,如@YU NO WORK所建議

基本上我從表'tags'中獲得所有選定標簽的tag_id

然后,我從表tag_map中選擇了所有映射到所選tag_id的照片id(ph_id)。

然后,我將其減少為ph_id,該ph_id與選定標簽的發生次數相同:

$numTags = count($arTagId); //$arTagId is an array of the selected tags

// get only photo ids that match both tags
$arPhId = array();
// in arPhId, find ph_ids that have occurances equal to $numTags
$arPhIdCnt = array_count_values($arPhIdAll); //$arPhIdAll is array of all ph_id that match all selected tag_ids

foreach($arPhIdCnt as $pid => $pidQty) {
  if($pidQty == $numTags) {
    $arPhId[] = $pid;
  }
}

因此,我最終得到一個僅包含與兩個tag_id匹配的ph_id的數組。

感謝大家的幫助。

您將不得不將表與自身連接起來,代碼可能會有些復雜。 PHP將是一個更容易的解決方案,但不是一種高效的解決方案。

您必須基於ph_id將表與其自身連接,然后檢查table1實例的tab_id col等於1以及table2實例的tab_id等於5。

SELECT t1.* FROM tag_map t1, tag_map t2
WHERE t1.ph_id = t2.ph_id
AND t1.tag_id='1' 
AND t2.tag_id='5';

如果願意,可以使用內部聯接

SELECT t1.* FROM tag_map t1
INNER JOIN tag_map t2 on t2.ph_id=t1.ph_id
WHERE t1.tag_id='1' 
AND t2.tag_id='5';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM